Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >angr 漏洞发现官方例子 —— strcpy_find

angr 漏洞发现官方例子 —— strcpy_find

作者头像
用户1423082
发布于 2024-12-31 10:32:50
发布于 2024-12-31 10:32:50
6700
代码可运行
举报
文章被收录于专栏:giantbranch's bloggiantbranch's blog
运行总次数:0
代码可运行

这个例子的程序比较简单

main函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int __cdecl main(int argc, const char **argv, const char **envp)
{
  size_t v3; // rbx@4
  size_t v4; // rax@5
  char s[8]; // [sp+10h] [bp-30h]@2
  int i; // [sp+2Ch] [bp-14h]@2

  if ( argc <= 2 )
  {
    func3(*argv, argv, envp);
  }
  else
  {
    strcpy(s, "Unu`mmx!onu!uid!q`rrvnse///");
    for ( i = 0; ; ++i )
    {
      v3 = i;
      if ( v3 >= strlen(s) )
        break;
      s[i] ^= 1u;
    }
    v4 = strlen(s);
    if ( !strncmp(argv[1], s, v4) )
      func(argv[2]);
    else
      func("Wrong password!");
  }
  return 0;
}

func3

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int __fastcall func3(__int64 a1)
{
  return printf(
           "Usage: %s <password> <message_to_store>\n"
           "Note: You can only post a custom message if you give the right password!\n",
           a1);
}

func

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int __fastcall func(const char *a1)
{
  char dest; // [sp+10h] [bp-30h]@1

  strcpy(&dest, a1);
  return printf("Your Message: %s\n", &dest);
}

可以看到漏洞点是在func,那我们怎么写脚本呢

  1. 载入程序,获得控制流程图,进而获取strcpy函数和func3函数的地址
  2. 构造命令行参数,创建一个entry_state和simulation_manager
  3. 从simulation_manager中找到满足当前执行到strcpy,而且strcpy的源地址真是我们输入的argv[2]那时候的状态,我们再输出argv[1],那么就找到了如何到达那个strcpy的argv[1]了

完整代码如下:(跟着官方的代码敲了一下)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
import angr
import claripy

def main():
    def getFuncAddress(func_name, plt = None):
        # for addr,func in cfg.kb.functions.iteritems():
        #     if func.name == func_name and (plt is None or func.is_plt == plt):
        #         return func.addr
        found = [
                addr for addr,func in cfg.kb.functions.iteritems()
                if func_name == func.name and (plt is None or func.is_plt == plt)
                ]
        if len( found ) > 0:
            print "Found "+func_name+"'s address at "+hex(found[0])+"!"
            return found[0]
        else:
            raise Exception("No address found for function : "+func_name)

    def check(state):
        if (state.ip.args[0] == strcpy_addr):
            BV_strCpySrc = state.memory.load(state.regs.rsi, len(argv[2]))
            strCpySrc = state.solver.eval( BV_strCpySrc , cast_to=str )
            return True if argv[2] in strCpySrc else False
        else:
            return False


    project = angr.Project("./strcpy_test", load_options={'auto_load_libs':False})
    # get control flow graph
    cfg = project.analyses.CFG(fail_fast=True)
    strcpy_addr = getFuncAddress("strcpy", True)
    func3_addr = getFuncAddress("func3")

    argv = [project.filename]   #argv[0]
    sym_arg_size = 40
    sym_arg = claripy.BVS('sym_arg', 8*sym_arg_size)
    argv.append(sym_arg)        #argv[1]   
    argv.append("HAHAHAHA") # argv[2]

    state = project.factory.entry_state(args=argv) 
    sm = project.factory.simulation_manager(state)

    sm = sm.explore(find=check, avoid=(func3_addr,))
    found = sm.found

    if ( len( found ) > 0 ):    #   Make sure we found a path before giving the solution
        found = sm.found[0]
        result = found.solver.eval(argv[1], cast_to=str)
        try:
            result = result[:result.index('\0')]
        except ValueError:
            pass
    else:   # Aww somehow we didn't find a path.  Time to work on that check() function!
        result = "Couldn't find any paths which satisfied our conditions."

    print 'The password is "%s"' % result
	
main()

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(angr) angr@e766290917a5:~/angr-workdir/examples/strcpy_find$ python angrexp.py 
Found strcpy's address at 0x4004a0L!
Found func3's address at 0x40061d!
The password is "Totally not the password..."

验证

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(angr) angr@e766290917a5:~/angr-workdir/examples/strcpy_find$ ./strcpy_test "Totally not the password..." "giantbranch test"
Your Message: giantbranch test

Reference

https://docs.angr.io/docs/examples.html#vulnerability-discovery

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
angr学习-入门篇
资源链接:https://github.com/jakespringer/angr_ctf(题库仓库,里面有个讲解angr的PPT,里面有官方的题解很详细) https://github.com/Hustcw/Angr_Tutorial_For_CTF
红队蓝军
2023/08/01
2520
原创 Paper | 从 XZ 后门学奇技淫巧
对CVE-2024-3094漏洞的分析文章网上已经有好几篇了,这里来学习一下在该事件中后门隐藏的奇技淫巧。
Seebug漏洞平台
2024/05/11
3060
原创 Paper | 从 XZ 后门学奇技淫巧
0x00sec Memo Manager
我们输入data的时候可以二次输入,那么就可以堆溢出了,最后的那里相当于给了提示,不过暂时看来只能溢出top chunk
用户1423082
2024/12/31
410
TAMUCTF-2019 Write up
gets可以造成栈溢出,最终只需要劫持程序执行流到printflag函数就行,strncpy中将src拷贝到dest上可以覆盖栈上的v2指针,而two函数和printflag函数只有最后一个字节不同,所以不用再去爆破一个1/16
安恒网络空间安全讲武堂
2019/05/09
1.7K0
Exploit自动生成引擎:Rex
来自 UCSB 的团队 Shellphish,为参加 DARPA 举办的 CGC 竞赛,设计并实现了 CRS(Cyber Reasoning System)Mechaphish。该系统包含自动化漏洞挖掘模块 Driller、Exploit自动生成引擎 Rex、自动补丁模块 Patcherex 以及 ropchain 生成模块 angrop。本文主要对其中的 Exploit 自动生成引擎 Rex 进行介绍,通过分析 Rex 源码,重点对 Crash 复现及可利用判断部分进行说明。弟作为一只资深菜鸡,文中难免存在不当之处,望各位师傅指正 Orz…
FB客服
2019/09/17
1.3K0
Exploit自动生成引擎:Rex
从样本中学习反调试
  最近对某银行app进行了重新逆向,发现他的安全防护措施几个月来并没有更新,还是很容易就搞定了反调试,它的表现是在一开头就把自己ptrace上导致你无法使用Frida进行hook,但是用-f参数进行spawn模式启动就能成功hook上了。现在的app如果在so层做加壳反调之类的一般都会加上ollvm,对逆向人员极不友好,我遇到的这个样本是难得的没有用ollvm的样本,所以虽然成功绕过了它的反调,那就顺便拿它来学习一下它是如何做防护的。
大A
2023/02/14
1.1K0
从样本中学习反调试
CTF QEMU 虚拟机逃逸之强网杯2019线上赛qwct
一开始在16.04,18.04上尝试启动,结果安装的依赖库好像版本不太符合要求,最终在19.04上面安装依赖库即可启动了,看来强网杯还是紧跟最新的系统啊
用户1423082
2024/12/31
280
CTF QEMU 虚拟机逃逸之强网杯2019线上赛qwct
CTF QEMU 虚拟机逃逸之HITB-GSEC-2017-babyqemu
我们用ida载入,由于有符号的,函数那直接搜索hitb就出现相关函数了,通过初始化函数即下面的init函数可以看到device id是0x2333(记住WORD1这个是device id就行),还有设置了pci_hitb_realize也是初始化的,pci_hitb_uninit就是跟pci_hitb_realize相反的操作,进行destroy,del等操作
用户1423082
2024/12/31
760
CTF QEMU 虚拟机逃逸之HITB-GSEC-2017-babyqemu
angr ctf使用
样本地址:https://raw.githubusercontent.com/angr/angr-doc/master/examples/b01lersctf2020_little_engine/engine
tea9
2022/07/16
3850
深思杯PWN复现(一)
https://pan.baidu.com/s/1fbtezOCoB2GXf2psd52wzA
yichen
2020/10/28
6740
深思杯PWN复现(一)
EIS2017 CTF writeup
array(7) { ["_GET"]=> array(1) { ["args"]=> string(7) "GLOBALS" } ["_POST"]=> array(0) { } ["_COOKIE"]=> array(0) { } ["_FILES"]=> array(0) { } ["TheHiDdenfl4g"]=> string(25) "EIS{GE7_fl4g_w17h_GL0B4L}" ["args"]=> string(7) "GLOBALS" ["GLOBALS"]=> *RECURSION* }
用户5878089
2019/07/25
8780
EIS2017 CTF writeup
AUTO PWN
ref: https://bbs.pediy.com/thread-266757.htm
i0gan
2021/06/26
2.2K0
house of force —— BCTF 2016-bcloud
这个技术就是覆盖top chunk的size,控制下下次分配的返回内存,从而进行任意写
用户1423082
2024/12/31
520
house of force —— BCTF 2016-bcloud
CTF QEMU 虚拟机逃逸之Defcon 2018 - EC3
这个题目给的qemu-system-x86_64的符号是被stripped掉了,相当于增加了点难度
用户1423082
2024/12/31
710
CTF QEMU 虚拟机逃逸之Defcon 2018 - EC3
BUUCTF 刷题笔记——PWN 2
先验文件,本题文件为 32 为可执行文件,保护约等于没开。值得注意的是,该文件又是静态链接,因此又可以直接调用一些未被调用过的函数来解题,比如老朋友 mprotect() 函数。
h-t-m
2023/03/10
1.5K0
BUUCTF 刷题笔记——PWN 2
Ret2dl_resolve漏洞利用分析
ret2dlresolve是linux下一种利用linux系统延时绑定(Lazy Binding)机制的一种漏洞利用方法,其主要思想是利用dlruntimeresolve()函数写GOT表的操作,改写写入GOT的内容,使其成为getshell的函数值。
FB客服
2020/05/14
8940
Ret2dl_resolve漏洞利用分析
【愚公系列】2021年12月 攻防世界-简单题-MOBILE-011(黑客精神)
文章目录 一、黑客精神 二、使用步骤 1.运行app 2.jadx反编译apk 3.IDA打开so文件 4.函数分析 5.脚本爆破 总结 ---- 一、黑客精神 题目链接:https://adworl
愚公搬代码
2021/12/27
4660
【愚公系列】2021年12月 攻防世界-简单题-MOBILE-011(黑客精神)
Linux (x86) Exploit 开发系列教程之八 绕过 ASLR -- 第三部分
在这篇文章中,让我们看看如何使用 GOT 覆盖和解引用技巧。来绕过共享库地址随机化。我们在第一部分中提到过,即使可执行文件没有所需的 PLT 桩代码,攻击者也可以使用 GOT 覆盖和解引用技巧来绕过 ASLR。
ApacheCN_飞龙
2022/12/01
1.9K0
Linux (x86) Exploit 开发系列教程之八 绕过 ASLR -- 第三部分
pwnable.kr
目标:覆盖 key 的值为 0xcafebabe。找一下 overflowme 到 key 的偏移量就好了。
wywwzjj
2023/05/09
6100
CTF QEMU 虚拟机逃逸之XNUCA 2018 SSD
通过查看xnuca_class_init函数,可以知道xnuca对应00:04.0 Class 00ff: 1234:11e9
用户1423082
2024/12/31
540
CTF QEMU 虚拟机逃逸之XNUCA 2018 SSD
相关推荐
angr学习-入门篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档