본문 바로가기

Pwnable/Dreamhack

[Pwnable] Dreamhack_out_of_bound

https://dreamhack.io/wargame/challenges/11/

 

out_of_bound

Description 이 문제는 서버에서 작동하고 있는 서비스(outofbound)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾고 익스플로잇해 셸을 획득하세요. "flag" 파일을 읽어 워게임 사이트

dreamhack.io


아래의 코드를 보면 name과 *command 변수가 선언되어 있다.

 

그리고 아래에서 name과 idx를 입력받고 있다.

 

Command에 대한 oob 제약이 없으므로, idx를 통해 command를 넘어서 name의 값을 가져올 수 있을 것 같다.

 


먼저 name과 command 사이의 거리를 확인해보면

Name = 0x804a0ac

Command = 0x804a60

이 나오고, 둘 사이의 거리는 76이라고 한다.

 

여기에서 몰랐던 사실이 있는데, command는 char*형 이라서 원소 하나가 포인터 값이라 4바이트 크기를 가진다고 한다.

그러니까 결국 76/4 = 19가 된다는 말이다.

 

그럼 생각해보면 둘 사이가 19만큼 차이가 난다는 뜻이고, 정리해보면

 

Name[1]
Name[0] = command[19]      | 0x804a0ac
..
..
..
..
command[3]
command[2]
command[1]
command[0]                  | 0x804a60

 

이런 형식이 될 것이고, 그럼 name[0]에 “/bin/sh”를 넣어서 idx로 19를 주면 될 것 같지만 여기서 또 몰랐던 부분이 있다.

System 함수의 인자를 받아줄 때에는 +4바이트에 인자를 넣어야 한다고 한다,,, 첫 4바이트에는 해당 변수의 주소를 넣는다고 헌다,,, 나만 몰랐나벼

 

그러면 name[1]에 “/bin/sh”를 넣어주고, name[0]에는 name[1]의 주소를 넣어주면, name[0]에 있는 주소가 가리키는 “/bin/sh”를 system에게 인자로 넘겨주게 된다.

Name[1]의 주소는 4바이트 차이니까 0x804a0b0이 되고, 코드는 아래와 같이 작성하였다.

 

실행하면 flag를 얻을 수 있다.

'Pwnable > Dreamhack' 카테고리의 다른 글

[Pwnable] Dreamhack_ basic_exploitation_002  (0) 2022.08.26
[Pwnable] Dreamhack_oneshot  (0) 2022.08.26
[Pwnable] Dreamhack_ basic_exploitation_000  (0) 2022.08.25