[pwn]逻辑复杂利用简单

逻辑复杂利用简单的pwn

遇到了一道坑有很多的题,记录一下。题目:forgot,题目地址:forgot

首先查看安全策略
[pwn]逻辑复杂利用简单_第1张图片
不是很高,就一个NX,看看代码逻辑吧,直觉告诉我并不简单:
[pwn]逻辑复杂利用简单_第2张图片
[pwn]逻辑复杂利用简单_第3张图片
一张图放不下,其实有溢出,但我由于主函数太长了还一堆小函数,没注意(吓到了)。中间switch之中的一堆小函数都是判断是不是字母、数字、下划线之类的,比如:
在这里插入图片描述
在这里插入图片描述
而且最后有个调用:
在这里插入图片描述
调用的值又和v14有关,导致我没有最开始仔细分析如何调用而去分析上面那个switch的逻辑了,其实就是根据用户输入的字符串的格式不同给v14赋不同的值。完整的逻辑是一个类似邮箱的字符串[email protected]这种,就会让v14值为10,其他的根据完整成都值不同。最后调用V3+v14-1这个地址。在上面代码中可以看出,v3-v12都在最开始赋了一个函数,都是一些输出字符串的函数。 这里看反汇编代码不好明白这个是怎么计算的,直接看汇编代码:
在这里插入图片描述
将v14-1,然后调用v3变量下面v14值对应的变量指向的函数。由于小函数实在太多,我没有一个一个去看,通过string表发现了一个函数:
[pwn]逻辑复杂利用简单_第4张图片
函数有了,然后发现逻辑只要我们输入的字符串前面是小写字母并且之中没有@,那么v14的值就一直是2,最后减1编程1,最后调用的就是v4,溢出点在:
在这里插入图片描述
计算v2和v4的相对位移,然后覆盖就好,具体看exp:

from pwn import *

p=process("./3d000793d15b444ab46e99e165e9454b")

flag_addr=0x80486CC
payload='a'*0x24+p32(flag_addr)

print p.recv()
p.sendline("chen")
print p.recv()
p.sendline(payload)
print p.recv()

可谓一顿操作猛如虎,一看溢出一步走!
[pwn]逻辑复杂利用简单_第5张图片

你可能感兴趣的:(二进制,ctf,#,ctf-pwn)