BUUCTF-picoctf_2018_rop chain
常规check

只是开启了nx
拖入ida
vuln中明显栈溢出,嘿嘿又是它

再进入flag中瞅瞅

函数参数为a(也就是下面那个判断中a等于0xDEADBAAD的a)
只要满足这个win1 && win2 && a1 == 0xDEADBAAD,就可以得到flag
当时我做的时候因为太菜了,一直在纠结这逻辑与(&&)完了咋还能等于一个数字呢???
然后思索良久,嗷,断错了,他的意思是
一个判断式(win1&&win2),另一个是(a==0x一堆),这两个的结果再去进行逻辑与
当时感叹自己c语言学的跟粑粑一样(确实没上过这门课,只是旁听过)
然后就是rop了,函数啥的都有了
1.win1的赋值

在win1_function中,他已经是1了,不去管,但是记得执行一下这个函数
2.win2赋值

又是逻辑与运算
一个表达式(win1),另一个(a1==0xBAAAAAAD),然后两者进行与运算。这里的a1是这个函数的参数,我们只要传入就可以,和之前a1无任何关系。
3.a1赋值
注意到这里的a1是函数flag的参数,我们直接传入即可
最后的结果

稍微再去解释一下,0x18+0x4栈溢出,之后跟上win1_function的地址,执行win1_function,之后是它的返回地址(win2_function)和参数,win1_function没有参数。然后win2_function的返回地址(flag函数)和参数。对于flag函数来说,我们不再需要控制程序,所以他的返回地址可随意。

浙公网安备 33010602011771号