S3

PWN

题目:baby_stack

拿到附件,die检查为64位ELF文件,checksec检查开启哪些保护

拖进ida分析,存在binsh
并且buf缓冲区大小为0x10+8

exp如下:

题目:猜数字

拿到附件,die检查为32位ELF文件,checksec检查开启哪些保护

拖进ida分析,存在binsh

printf没有进行输出参数限制,攻击者会借%p使printf多打印出栈上的数据,如下

可以看出输进去的数据的偏移位置为第5个偏移位置。再分析whille循环里的代码,将用户输入的数字与随机数种子随机产生的数字进行比较,比较十次,若十次全对,则能调用system触发binsh夺取shell;困难的是如何十次猜对随机数种产生的随机数呢,这就能利用格式化字符串漏洞把随机数种改成一个确定的数字,这样他就会只产生那十个数字,也就是伪随机数字,如何改写随机数种呢,这就利用%5$n来改写对应内存的内容了。

找到随机数种的地址

构造payload,p=flat(seedaddr,b"%5$n"),该payload含义是,将printf前边输出的四个字节转化为4写入偏移位置为5的内容中,而第五位刚好就是seedaddr,32位程序地址为4个字节。随机数种子确定了,那他每轮产生的数字也就确定了。剩下的一个一个试就行。我的exp中它每轮产生的是1 3 4 6 3 7 5 3 8 5 ,不变的。

exp如下:

题目:劳逸结合

拿到附件,die检查为64elf文件,checksec检查保护措施

拖进IDA分析,存在binsh

分析代码流程,输入choice,让程序执行,可以看出若mark大于999,才能执行read函数,并且保证health与happy大于0,可以选择先循环执行100次2,3选项,此时health为9900,happy为2000,mark为-100,再选择执行200次1,此时health为9700,happy为1000,mark为1900。达成条件,然后选择4,发送payload让read函数接收。

exp如下:

题目:再来一次

拿到附件,die检查为64位ELF文件, checksec检查保护措施

拖进IDA分析

无system无binsh,但附件给了libc,是一道ret2libc类型的题

存在明显的溢出漏洞,gets函数,但需要根据puts函数的plt表泄露出got表的真实地址,来计算出system与binsh的地址。

先找下需要用的gadgets

构造第一个payload,p1=flat(b'a'*(0x10+8),rdi,putsgot,putsplt,main,word_size=64),泄露libc之后,计算出system与binsh,再构造第二个payload,p2=flat(b'a'*(0x10+8),ret,rdi,bin,system,word_size=64),得到shell。

exp如下:

Reverse

题目:你好,逆向工程

下载附件 ,拖进die发现没有壳,且为64,直接放进ida64 找到main函数

分析发现其实是定义了三个数组,cp1[ ] cp[ ] flag[ ] ,第一个for循环是对cp1进行每位由与flag[i]的和进行赋值,但是不知flag[i],继续向下看,发现第二个for循环是判断cp1[i]是否等于cp[ [i],如果不等就退出程序了,相等的话Congratulation了,所以cp1[i]=cp[i]的,所以来写代码
得到flag[i],注意得到的是数字,之后我用python chr了一下得到flag