https://dreamhack.io/wargame/challenges/11/
아래의 코드를 보면 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 |