Pwn
见到别的比赛的pwn题才幡然醒悟,已经没有比这些更简单的pwn题了。
easy pwn
首先,拿到Pwn题的第一步,看是64位还是32位
第二步 gdb看开了哪些保护
【1】Canary:Canary保护机制的原理,是在一个函数入口处从fs段内获取一个随机值,一般存到EBP - 0x4(32位)或RBP - 0x8(64位)的位置。如果攻击者利用栈溢出修改到了这个值,导致该值与存入的值不一致,__stack_chk_fail函数将抛出异常并退出程序。Canary最高字节一般是\x00,防止由于其他漏洞产生的Canary泄露
【2】FORTIFY:FORTIFY_SOURCE机制对格式化字符串有两个限制(1)包含%n的格式化字符串不能位于程序内存中的可写地址。(2)当使用位置参数时,必须使用范围内的所有参数。所以如果要使用%7$x,你必须同时使用1,2,3,4,5和6。
【3】NX:NX enabled如果这个保护开启就是意味着栈中数据没有执行权限,以前的经常用的call esp或者jmp esp的方法就不能使用,但是可以利用rop这种方法绕过
【4】PIE:PIE enabled如果程序开启这个地址随机化选项就意味着程序每次运行的时候地址都会变化,而如果没有开PIE的话那么No PIE (0x400000),括号内的数据就是程序的基地址
【5】RELRO:RELRO会有Partial RELRO和FULL RELRO,如果开启FULL RELRO,意味着我们无法修改got表
第三步,拖入ida反汇编
可以看到本题只需要让v5等于2019便可以执行sh了。
然后看一下他的栈结构,这边var_4便是v5(双击v5就可以跳到var_4)
因为read(0,&buf,0xC)可以知道,我们可以输入11位字符,所以我们只需要让最后四位是2019,就可以覆盖到var_4,也就是可以令v5等于2019.
于是写出exp
这边payload的\n加不加其实是一样的,加了\n表示就是结束输入。
exp里面主要是
导入pwn
连接到服务器
构建payload
发送payload
最后这个这题是一样的,因为不需要获取的shell,就是不需要获取控制权,他的意思就是把控制权交给用户。本题是当你执行到就直接给你flag的,不会给你控制权
莽撞人
首先一波常规操作,找到漏洞点,发现buf是0x10位的空间,但是可以输入0x50的内容
可以发现,这边有一个函数是getShell,只要执行到这个函数,就执行systm(“/bin/sh”)
栈结构为junk+ebp+ret_address+参数1+参数2+……+参数n
于是我们只需要将read到buf中的数据,覆盖到ret_address为getShell()地址。
反向读取
这边比较关键的是要发现漏洞点,因为要让if(*((_BYTE )&v2+i)==((_BYTE *)&v8+s[i]))一直都是成立的。
可以发现,当char类型的大于127会变成负数,所以我们可以利用这一点让他们相等。
通过分析,可以发现v2和v8相差0x40也就是64,所以*(&v2)=*(&v8-64)
构建exp如下,这边192就是-64
然后,就得到了flag
Misc
drop the beats
这是一道音频的杂项题,因为比较简单,所以这种简单的音频题我知道的一般就是一个mp3隐写,要么就是拖入Audacity频谱分析了
拼东东
一个损坏的zip,第一步就是想到拖到winhex里面看下文件头,发现没有zip的文件头50 4B 03 04,加上后就可以正常打开了。
消失的50px
这题很明显就是一个改图片高度的题了,拖入winhex找需要修改的高度。
可以看到图片高度是350像素,转换成16进制就是015E
然后找到015E,把他改大一些就好了。