profile image

L o a d i n g . . .

1. 문제

보호 기법을 확인해보니 NX bit만 걸려있는 상황이다.

 

파일을 실행해보니 말 그래도 basinrobins31 게임을 한다.

 

 

ida로 까본 모습이다.

my_turn 함수과 your_turn 함수를 살펴보도록 하자.

 

 

your_turn 함수를 살펴보니 read 함수로 입력받은 부분에서 overflow가 발생함을 알 수 있다.

다음과 같이 해서 쉘을 획득할 수 있을 것 같다.

 

1. 쓰기 가능한 영역에 binsh 저장

 

2. write 함수로 read_got leak 시킴

 

3. leak된 주소 받아서 system 함수 주소 구하고, got overwrite 함

 

4. read 호출하면 system 함수 호출되서 쉘 획득

 

 

gadget 세개짜리 (ret)

인자 1

인자 2

인자 3

함수 호출

gadget 세개짜리 (ret)

.

.

 


2. 문제 해결 과정

 

구해야 될 것들을 구해보자!

 

1. 쓰기 가능한 영역

vmmap

 

bss : 0x602090

 

 

2. read_system offset

read_system offset : 0xb1f70

 

 

3. gadget

pop rdi; ret : 0x400bc3

 

pop rdi; pop rsi; pop rdx; ret : 0x0040087a

 

64bit 함수 호출 규약에서는 레지스터에 인자값을 저장하는데, 그 순서가 rdi. rsi. rdx.. 순이다.

따라서 아무 가젯이나 쓰면 안되고 저기에 맞게 써야한다!!

 

 

read, write 함수의 plt, got는 elf를 통해 구하도록 하자.

 


3. Exploit

위 논리대로 payload를 작성해보았다.

 

성공적으로 쉘을 획득하였다!

기본적인 rop 문제였는데, 다만 x64에서는 payload를 작성하는 법이 x86과 약간 다르다(함수 호출 규약 차이 때문에).

'Wargame > etc' 카테고리의 다른 글

[HITCON training] lab 12 secretgarden  (0) 2021.05.11
[HITCON training] lab 5 simplerop  (0) 2021.04.12
[pliadCTF 2013] - ropasaurusrex(basic x86)  (0) 2021.04.03
[HITCON training] lab4 ret2libc  (0) 2021.03.21
복사했습니다!