| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 가명정보처리
- 포너블
- 디오판투스 알고리즘
- 유클리드_알고리즘
- 백엔드입문
- function scope
- package.json
- 모듈러 연산
- pwnable.tw
- arrow function
- 웹 프레임워크
- 개인정보보호교육
- 확장 유클리드 알고리즘
- 동적타이핑
- 곱셈 암호
- 덧셈 암호
- 백엔드
- 개인정보보호위원회
- 개인정보보호
- package-lock.json
- 마감임박
- 국가인적자원개발컨소시엄
- 개인정보안전성
- 호이스팅
- 한국정보보호산업협회
- 한국산업인력공단
- Writeup
- 한국정보보호산업협회기자단
- node.js
- 무료교육
- Today
- Total
짱짱해커가 되고 싶은 나
[2013 Plaid CTF] ropasurusrex writeup 본문

파일을 실행시켜보니 입력을 받고 WIN을 출력한다.
checksec로 보호기법을 확인해봤는데 NX가 걸려있다. 쉘코드로 공격은 불가능하다.
(aslr걸려 있는 문제)
objudmp로 함수가 무엇이 있는지 확인해보니 <.init> <.fini> 등이 있었다.
IDA로 main함수를 확인해봤다.

어떤 함수를 출력하고 WIN을 표준출력으로 write한다.
아마 저 함수는 scanf 또는 read와 같은 입력함수 일것이다.
저 함수에 들어가보니 read함수임을 확인할 수 있다.

buf에 0x100만큼 입력받는 것을 확인할 수 있다.
buf가 0x100보다 작은 크기라면 bof가 가능할 것이다.
그런데 IDA에서 buf는 ebp-0x88이라고 하니 bof가 가능하다. (0x88+4만큼 덮으면 RET 덮기 가능)

read plt의 주소는 0x804832c이고 read got의 주소는 0x804961c, write plt의 주소는 0x804830c, write got의 주소는 0x8049614다.
bss에다가 /bin/sh해야하니까 bss주소도 알아오자

bss주소는 0x8049630이다.

그리고 system주소를 출력하려고 하는데 계속 no symbol table is loaded가 떴다.
알고보니 이 file은 동적링킹이다.

그래서 파일 디버깅을 시작해놓지 않았기 때문에 라이브러리가 로드 되지 않은 것이다.
read는 바이너리에 포함되어 있었기 때문에 start를 하지 않아도 주소가 뜰 수 있었다.
+start는 main에 자동으로 bp를 걸고 run하는 명령어라고 한다.
자 이제 가젯들을 구해보자.
objudmp -d ropasaurusrex | grep -B4 "ret" 명령어로 확인할 수 있다.

우리는 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

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