jarvisoj_level2_x64逆向分析
依旧是先下载附件,checksec一下然后丢到ida里去看
这是一个64位的程序只开启了NX防御不允许栈执行,没有栈溢出的防御很有可能又是一个利用栈溢出的题目看看ida
main函数很简单,发现有调用system函数,看看另一个函数是干啥的
发现read函数有栈溢出,那么我们可以构造一个ROP去执行system(/bin/sh),找一下程序里有没有/bin/sh字符串。
根据buf在栈上的位置,应该填充136位。通过ROPgadget命令可以找到0x00000000004006b3 : pop rdi ; ret在64位系统里是通过寄存器向函数传参所以我们只需要将rdi里填充/bin/sh的地址再执行system函数就是执行system(/bin/sh)。
payload写一下payload
1234567891011121314151617from pwn import *from LibcSearcher import *context.termi ...
ciscn_2019_c_1逆向分析
附件下载分析
栈溢出防御stack和PIE没有开看起来有可能还是一个非常基础的栈溢出的问题ida分析一下
main函数
1234567891011121314151617181920212223242526272829303132333435363738int __fastcall main(int argc, const char **argv, const char **envp){ int n2; // [rsp+Ch] [rbp-4h] BYREF init(argc, argv, envp); puts("EEEEEEE hh iii "); puts("EE mm mm mmmm aa aa cccc hh nn nnn eee "); puts("EEEEE mmm mm mm aa aaa cc hhhhh ...
bjdctf_2020_babystack逆向分析
依旧下载附件,checksec一下。
防御开启的很少就一个NX,看起来很简单再看看ida的逆向怎么说
发现就是很简单的一个栈溢出找找backdoor。
很明显的backdoor,找一下地址0x4006E6再分析一下溢出的offset是多少计算一下通过0x10+8位的RBP,所以应该是24位
简单写个payload
payload12345678910111213141516from pwn import *context.terminal = ['tmux', 'splitw', '-h']p=process('./bjdctf_2020_babystack')#gdb.attach(p, gdbscript='''# b *0x4007c5#''')#p=remote('node5.buuoj.cn',26102)offset=24backdoor_addr=0x4 ...
ciscn_2019_n_8逆向分析
依旧是有附件的题目,首先checksec一下看看防御措施开了那些
可以发现大部分的防御都开启了而且这是一个32位的文件,我们再利用ida分析一下它的逻辑
main函数的逻辑很清晰,system函数也存在就是让n17=17就能成功获得bash,现在要考虑如何让n17=17。
我们发现var和n17两个变量都是全局变量,而main函数里主要是通过init函数来检测有没有栈溢出完全对全局变量的溢出没有影响。
通过ida里的测算var和n17之间的大小一共有54位,所以我们可以写一下payload
payload12345678910111213from pwn import *context.terminal = ['tmux', 'splitw', '-h']#p=process('./ciscn_2019_n_8')#gdb.attach(p, gdbscript='''# b *main#'' ...
jarvisoj_level2逆向分析
这个题目依旧提供了附件,依旧是ida分析钱先checksec一下
发现没有PIE和stack防御,再用ida分析一下
发现main函数先调用了另一个函数,去看看
发现read函数存在栈溢出,经计算需要140位填充才能覆盖地址。看一看程序里有没有/bin/sh字符串,也是可以用ROP命令去查的我用这个命令ROPgadget --binary ./level2 --string "/bin/sh"
发现/bin/sh字符串这样就不用自己去输入了,再找一下system的plt地址,ida里就能找到,再找一下ret的地址进行栈对齐
只需要ret的地址就行了,最后写一下payload
[!IMPORTANT]
函数里有system函数的一定要通过pwntools里的recvuntil这个命令去跨过它不然就会进入system的命令流出不来了read函数也就接受不到消息,栈溢出也就无从谈起了。
payload12345678910111213141516171819202122from ...
[第五空间2019决赛]PWN5—1逆向分析
依旧还是熟悉的ida分析,发现有些不对劲,通过checksec检查一下文件。执行checksec pwn
发现NX防御是开着的Stack防御也是开着的证明这道题并不是简单的栈溢出问题,再仔细看看代码。
发现了危险函数调用只需要让我们第二次输入的和buf相同就行,可是buf是每次随机生成的我们要怎么知道或者修改呢,刚刚说过了栈溢出不能使用因为这个文件里有readsdword函数进行栈检查,一溢出就会报错。再看看,发现了printf(buf)函数,buf是我们可以控制的。所以这道题不是栈溢出漏洞而是格式化字符串漏洞。,又因为PIE随机地址是关闭的,所以我们完全可以使用固定地址进行攻击,看代码逻辑可以发现只需要把``buf_这个变量进行修改就可以了,在ida里找到地址0x0804C044`。
[!NOTE]
printf这个函数大家都学过,它是通过第一个参数里的格式化字符串类似%d这样的进行判断是否要读取后面的数据,无论后面有没有参数。基于此如果发现有一个printf函数的首参数可以被控制那么就很有可能存在格式化字符 ...
pwn的环境目标: 搭建一个专业的pwn环境,熟练使用pwnner的“瑞士军刀”。
内容:
Linux环境搭建与入门: 我们需要一个Linux系统。我推荐使用WSL (Windows Subsystem for Linux)或者VMware/VirtualBox安装一个Ubuntu 20.04/22.04的虚拟机。我会带你熟悉pwn中必须用到的命令行指令,比如ls, cd, cat, chmod, grep, ssh等。这是基础中的基础。
神器pwntools入门: 这是用Python编写的pwn题解题框架,能帮你快速编写漏洞利用脚本,处理远程交互、打包解包数据等,是每个pwnner的必备神器。
调试利器GDB与插件: GDB是Linux下的主要调试工具。但原生的GDB对pwn不是很友好,所以我们会给它装上强大的插件,比如pwndbg或GEF。它们能让你在调试时清晰地看到栈、寄存器、反汇编代码等信息,是分析漏洞的左膀右臂。
Linux的环境初学者一般使用VMware的话会熟练一些,VM最新版也是免费的,官网下载安装即可。我这边使用wsl安装,在vM安装虚拟机的方法这边不做介绍。
...
jarvisoj_level0逆向分析
依旧先下载文件,ida分析。
经典的一个通过read函数栈溢出的漏洞,buf数组只有128位但是read却读进512位,依旧是测算填充数量的两个方法,128+8=136.
两项印证故必为136位,在加上ret进行栈对齐。找一下。
0x0000000000400431ret,0x400596callsystem这是两个地址。
offset=136。有了这些参数就可以开始写payload了。
payload123456789101112131415161718192021from pwn import *import structhost = "node5.buuoj.cn"port = 26832p = remote(host, port)# 偏移量#context.terminal = ['tmux', 'splitw', '-h']#p = process('./pwn1_sctf_2016')offset = 136 ...
pwn1_sctf_2016逆向分析
依旧是ida分析
可以看到main函数单纯就是调用了vuln这个函数,我们再看看vuln这个函数在干啥。
可以看到这段代码逻辑是十分混乱的看不懂,我们可以猜测,看见了I,you和replace,我们可以猜测它实现了将原先的I替换为了you
可以通过运行这个文件来检查
很明显,这个程序就是我们分析的那样。
我们又在程序里找到了一个后门函数getflag,地址为0x08048F0D,由于strcpy这个函数不检查边界,我们可以通过31*3=93位的栈溢出来攻击它。接下来就是计算需要溢出几位,这个就不能直接用cyclic测出来了。只能看ida上面ebx这个证明是32位程序,所以应该是0x3c+4=64位,所以可以通过21位的I加上1位的a来溢出。
payload12345678910111213141516171819202122from pwn import *import structhost = "node5.buuoj.cn"port = 26832p = remote(host, port)# 偏移量con ...
ciscn_2019_n_1逆向分析
依旧通过ida分析。
main函数里有两个设置缓冲区的,以及调用了func函数,我们看看func是干啥的。
一眼就看见了我们的老朋友gets函数,典型的栈溢出了。看这个函数的逻辑,我们需要让这个本来是0.0的v2变成11.28125
而看栈里的内存分配,正好v1可以覆盖v2,所以逻辑就很清楚了。通过v1的栈溢出将v2溢出成11.28125,看ida上面的内存分析
正好是填充完44个v1后就是v2。这样的话就可以开始写payload了。
payload123456789101112131415161718from pwn import *import structhost = "node5.buuoj.cn"port = 29129p = remote(host, port)# 偏移量#p = process('./pwn1')offset = 44float_v2 = struct.pack('<f',11.28125)payload = flat(b'a'* ...
