pwn1
看一下程序基本情况如下,动态链接的32位程序,只有canary保护没有打开。
IDA看一下程序,可以看到明显gets
函数处存在栈溢出,并且当v5等于某个值的时候,就执行print_flag
函数输出flag。右键那个值->hexadecimal,可以看到该值十六进制为0xDEA110CB,也就是当v5为该值,就会输出flag,所以只需要栈溢出覆盖v5的值为0xDEA110CB,不需要自己找system('/bin/sh')
计算一下偏移变量s到变量v5的偏移距离,由IDA得s=ebp-3Bh、v5=ebp-10h,两者偏移距离为2Bh
payload
因为服务器啥的已经没开了,所以只能纸上谈兵hh,但是这道题确实也就比较简单。
pwn2
先看一下该文件的详细信息,发现依旧只有canary没打开。是动态链接的32位程序。
IDA看一下程序,可以看到gets
函数存在明显的栈溢出漏洞,字符串和函数中都没有看到system
和bin/sh
的身影,并且下面有一个函数select_func
看一下代码逻辑,发现拷贝了0x1F个字符到目标字符串,如果目标字符串等于one
时候,将one
赋值给v3,然后调用v3()
看函数列表,存在one()``two()
函数以及print_flag()
,函数地址分别为0x00000754,0x000006AD,0x000006D8。
我们现在需要做的就是跳转到print_flag
函数,gets函数可以赋值31个字节给dest变量,dest与v3之间相差30个字节,可以溢出一个字节,v3初始值为two,two又与print_flag函数相差一个字节,所以溢出的一个字节就可以将v3的初始值修改为print_flag函数地址。
payload
pwn3
惯例看一下程序情况,发现只开了RELRO以及PIE,并且有RWX段。推测可能是自己写shellcode的题目。
IDA打开看一下,主要点进echo
函数看一下,发现存在gets
函数栈溢出漏洞(注意题目本身就泄露出了s的地址)
s的地址为ebp-12Ah,画个图看一下。s与EBP之间相差298个字节,s规定的数据为294字节大小,所以溢出够298+4个字节后将获取到的s地址覆盖掉函数返回地址、使程序跳转至s处执行shellcode。
payload
pwn4
发现只开启了NX保护
IDA查看字符串和函数,可以看到有‘/bin/sh’和system
函数,/bin/sh字符串,地址为0x0804A034
主函数循环执行laas
函数,该函数中可以看到gets函数存在明显栈溢出漏洞,如果在s字符串中没有找到ASCII码为47的字符/
,那么就传入s参数执行run_cmd
函数
在run_cmd()函数未进行任何过滤直接调用system()函数执行系统命令(虽然可以直接sendline('/bin/cat flag.txt')
,但是这道题还是走一下常规pwn思路):
看下call system()的地址,为0x080485AD,字符串s地址为ebp-21h:
payload
还有一种写法,下面就是利用system的地址,而不是cal了system的地址
pwn5
查看程序基本情况,发现是静态链接的,那就和libc无关了,并且只开了NX
IDA发现其实逻辑啥的和pwn4一样,不过下图圈起来这里变成了7(这里也可以直接用;$0
,还有一种利用vi命令及:shell的骚姿势,输入;vi
再输入:shell
即可执行shell)
也可以找到‘/bin/sh’字符串和system
函数。地址分别为0x080BC140和0x0804EE30,s地址为ebp-0Dh
看到别人写的是有exit函数地址,但是感觉替换成其他四个字节的数据也可以(实践了一下确实可以)
参考链接:TAMUCTF-PWN