2022网信杯CTF题目复刻之PWN 0x01

admin 2022年7月3日02:22:48评论101 views字数 2232阅读7分26秒阅读模式

PS:这是一个系列文章吧,把各类型的原题都通过源码复刻出来~~~~


《简单的malloc函数》


还是一样的操作,要复刻一道题目,先把他解出来,因为只有分析清楚了他的逻辑,才能进行复刻~


首先还是file或者checksec一下


2022网信杯CTF题目复刻之PWN 0x01


是带-no-pie参数编译的32位程序

先运行一下看看


2022网信杯CTF题目复刻之PWN 0x01


正常的puts、scanf或者read,都不重要,反正就是我们是要输入指定的东西才能触发什么东西最后得到我们想要得到的东西~~~~


因为题目本身比较简单,所以直接objdump分析一下即可


objdump -d pwn1a -M intel|less //个人比较喜欢看intel的汇编格式,所以-M intel,默认是AMD的汇编格式。


2022网信杯CTF题目复刻之PWN 0x01


芜湖~看到call了一个molloc函数,往上看push了一个0X40大小的buf,结合起来盲猜应该就是开辟一块大小0x40的内存空间,然后返回他的指针。

molloc之前 sub esp,0xc,下面call了read函数时push DWORD PTR [ebp-0xc]


2022网信杯CTF题目复刻之PWN 0x01


推算逻辑是开辟一个0x40大小的内存空间及指针,然后通过read函数接收我们输入的东西赋值给他。

这样说有点不好理解,内存和指针一说又要说很多,换种小白能理解的说法,molloc假设是一个自定义数据类型,molloc.1=指针(内存地址) ,molloc.2=内容(内存存放的内容),read函数读取我们输入指针及内容赋值给molloc这个自定义数据类型。

当然以上说法是方便大家理解,如果从程序角度来说就是扯淡~~~~


继续往下看


2022网信杯CTF题目复刻之PWN 0x01


一步步的分析


首先call了一个cmp的函数,紧接着就开始test了,je形成了条件分支。

这里可以猜测,我们上面输入的东西传参给cmp函数,cmp函数接收执行返回,根据返回test来决定je是否进行跳转。


先看一下不跳转call emmm这个函数,跳转了就直接puts "You Have LOST"接着结束程序了。


2022网信杯CTF题目复刻之PWN 0x01


看一下je的跳转条件是ZF=1,如果是本地破解程序的话,直接把ZF改成1,或者汇编nop掉就可以了,不过这是PWN,咱不扯远了~~~~


先看一下emmm函数是干什么用的


2022网信杯CTF题目复刻之PWN 0x01


一目了然,emmm函数就是call shell的,那么现在我们就要想办法不让je跳转。


我们发现让je是否跳转的关键是cmp这个函数,所以去分析一下这个函数


2022网信杯CTF题目复刻之PWN 0x01


看这两个关键点,再结合上面说到的molloc函数,可以清楚的推出逻辑,如果我们输入的指针=0xaabb8899以及值=0xeeccddff,那么je的跳转条件就不会成立。


验证一下我们的想法,代码如下:

from pwn import *p=process("./pwn1a")dem=("")payload=p32(0xaabb8899)+p32(0xeeccddff)p.sendlineafter(dem,payload)p.interactive()

执行,成功的得到了shell


2022网信杯CTF题目复刻之PWN 0x01


socat部署起来通过IP端口PWN效果也是一样,这里就不截图演示了。


------可爱的分隔线------



好了,所有逻辑我们都理通顺了,我们开始用C语言来复刻这一道PWN题。


拿shell的pwn题老三样先写出来


1、清空缓冲区

2022网信杯CTF题目复刻之PWN 0x01

void delvbuf(){        setvbuf(stdout,0,2,0);        setvbuf(stdin,0,2,0);        setvbuf(stderr,0,2,0);}

设置输入输出和错误缓冲区


2、来个调shell的函数

2022网信杯CTF题目复刻之PWN 0x01

void shell(){        system("/bin/sh");}


3、int main(){}开始写我们的逻辑。

2022网信杯CTF题目复刻之PWN 0x01

int main(){        int a;        int *buf;        delvbuf();        printf("input:");        buf=(int *)malloc(0x40);        read(0,buf,0x40);        if(cmp(buf)==1){                shell();        }else{                printf("errer!!!!");        }        return 0;}


分解一下代码逻辑

1、声明一个int类型变量a,声明一个指针buf

2、清空缓冲区

3、给个小提示输入

4、malloc 0x40大小 赋值给指针buf

5、read接收输入存入指针buf内存里

6、比对buf与cmp函数的return是否为1,为1则执行shell函数,否则输入错误!


再继续写cmp函数

2022网信杯CTF题目复刻之PWN 0x01

int cmp(int *a1){        return *a1== 0xaabb8899 && a1[1]==0xeeccddff;}

这里的意思是cmp函数,参数是一个指针,然后return 内存地址以及数据



至此,整个题目复刻完成。


完整代码如下:

2022网信杯CTF题目复刻之PWN 0x01


这里我就不贴代码出来了,希望小伙伴们可以自己手打一下,这样能够方便理解。


编译gcc pwn1a.c -o ptest -no-pie

2022网信杯CTF题目复刻之PWN 0x01

这里使用nopie不做过多解释,感兴趣的可以自己拓展学习,因为是简单的入门题目,所以不希望程序载入内存时地址浮动。


运行看一看

2022网信杯CTF题目复刻之PWN 0x01


直接socat部署起来,用解题的py直接pwn一下

2022网信杯CTF题目复刻之PWN 0x01


python代码如下

2022网信杯CTF题目复刻之PWN 0x01


python ppp.py 成功拿到shell

2022网信杯CTF题目复刻之PWN 0x01


至此,该道pwn题复刻成功!!!!


------可爱的分割线------


PS:本人也是抽空去复刻这些题目,应很多小伙伴的需求,如果你有一些想一步步刨析原理分析的题目,可以发邮件给我,我看时间和心情不定期出文章刨析(主要还是没有时间~~~~)


bluegeek only mail : [email protected]


原文始发于微信公众号(蓝极战队):2022网信杯CTF题目复刻之PWN 0x01

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年7月3日02:22:48
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   2022网信杯CTF题目复刻之PWN 0x01http://cn-sec.com/archives/1152058.html

发表评论

匿名网友 填写信息