짱짱해커가 되고 싶은 나

[2013 Plaid CTF] ropasurusrex writeup 본문

카테고리 없음

[2013 Plaid CTF] ropasurusrex writeup

동로시 2020. 10. 4. 15:48

파일을 실행시켜보니 입력을 받고 WIN을 출력한다.

checksec로 보호기법을 확인해봤는데 NX가 걸려있다. 쉘코드로 공격은 불가능하다.

(aslr걸려 있는 문제)

 

objudmp로 함수가 무엇이 있는지 확인해보니 <.init> <.fini> 등이 있었다.

 

IDA로 main함수를 확인해봤다.

main

어떤 함수를 출력하고 WIN을 표준출력으로 write한다.

아마 저 함수는 scanf 또는 read와 같은 입력함수 일것이다.

저 함수에 들어가보니 read함수임을 확인할 수 있다.

buf에 0x100만큼 입력받는 것을 확인할 수 있다.

buf가 0x100보다 작은 크기라면 bof가 가능할 것이다.

그런데 IDA에서 buf는 ebp-0x88이라고 하니 bof가 가능하다. (0x88+4만큼 덮으면 RET 덮기 가능)

 

read got, write plt

read plt의 주소는 0x804832c이고 read got의 주소는 0x804961c, write plt의 주소는 0x804830c, write got의 주소는 0x8049614다.

 

bss에다가 /bin/sh해야하니까 bss주소도 알아오자

bss

bss주소는 0x8049630이다.

 

system주소

그리고 system주소를 출력하려고 하는데 계속 no symbol table is loaded가 떴다. 

알고보니 이 file은 동적링킹이다.

동적링킹

그래서 파일 디버깅을 시작해놓지 않았기 때문에 라이브러리가 로드 되지 않은 것이다.

read는 바이너리에 포함되어 있었기 때문에 start를 하지 않아도 주소가 뜰 수 있었다.

+start는 main에 자동으로 bp를 걸고 run하는 명령어라고 한다.

 

자 이제 가젯들을 구해보자.

objudmp -d ropasaurusrex | grep -B4 "ret" 명령어로 확인할 수 있다.

pppr 가젯

우리는 pppr가젯이 필요하니까 이 주소는 0x80484b6이다.

 

Exploit

bof로 system("/bin/sh")를 만들것이다.

1. read got leak

write(1, read_got, 4)

//read_addr - offset = system_addr

 

2. bss에 /bin/sh쓰기

read(0, bss, len(/bin/sh)) 

//send(/bin/sh)

 

3. write got 를 system주소로 덮기

read(0, write_got, 4)

//send(system_addr)

 

4. system("/bin/sh") 실행

write_plt + AAAA + bss

 

rop_ex.py

exploit을 실행시키면 다음처럼 쉘이 따진 것을 확인할 수 있다.

 

실행화면

 

Comments