root-me/anti-debug

最近迷上了ELF逆向,觉得挺有意思。做了几道相关的题目后,深刻体会到debug大法好,有很多反debug的题目只需要修改几个跳转照样debug,直到我遇到这道题目。

这个类型的题目第一次遇见,查阅了一下资料,48号系统调用是sys_signal

根据以上信息,可以看出这个程序执行到int 3处时捕获断点,然后执行sigtrap的handler指向的函数,即本题目中我标记为code的地方。

这样如果用debugger运行这个程序,那么debugger会捕获断点并运行debugger自己的int 3 handler(即将控制转移到debugger),这样会导致程序中的代码将无法执行。

本来我打算将程序运行起来在进行输入的时候用debugger attach这个进程来看代码,结果读取输入的函数和进行解密比较的函数不是同一个函数,以我目前的姿势水平只能静态分析代码了,debug大法看来不能用了。

当然,这个程序肯定不会让我轻轻松松分析出来的,这个程序执行了5个函数,并用第一个函数将剩余4个函数进行了异或,不过这种程序的加密(根本算不上加密。。。)是没什么难度的。

from pwn import *

f = open(‘./0xx‘, ‘rb‘) #0xx是4个被异或了的函数的二进制文件
s = f.read()

code = ‘‘
i = 0

while i * 4 < len(s):
    code += p32(u32(s[i*4:i*4+4]) ^ 0x8048FC1)
    i += 1

save = open(‘save‘, ‘wb‘)
save.write(code)

然后用ida运行code,分一下函数,就清晰明了了。程序用第3个函数读取输入,关键在于第4、5个函数。

其中输入保存在8048251h处,第4个函数将输入的每个字符与FCh进行异或,然后与80482D1h处的字符串作比较。

只需将80482D1h处字符串与FCh异或即可得到flag。

f = open(‘./src‘, ‘rb‘)

src = f.read()

ans = ‘‘

for i in src:
    ans += chr(ord(i) ^ 0xfc)

print ans

总结:我觉得肯定有办法debug这个程序,但是我姿势水平低,若有表哥有办法,还请表哥不吝赐教。

题目地址:http://challenge01.root-me.org/cracking/ch13/ch13.zip

时间: 2024-08-10 19:10:15

root-me/anti-debug的相关文章

al-khaser学习笔记(一)Anti Debug

al-khaser 最近在研究开源项目al-khaser在野恶意软件使用的常用技术  github https://github.com/LordNoteworthy/al-khaser Anti Debug 这一部分主要是通过各种函数去确定当前进程是否处于被调试的状态. VOID exec_check(int(*callback)(), TCHAR* szMsg) 两参数,第一参数是一个回调函数指针 第二参数是一个需要输出打印的字符串 功能 通过回调函数的返回值以及第二参数szMsg,在函数p

数据结构

void init() { for(int i = 1;i <= n;i++) pre[i] = i; } int findd(int x) 递归 { return pre[x] == x?x:findd(pre[x]); } void join(int a,int b) { int x = findd(a),y = findd(b); if(x != y) pre[x] = y; } 并查集 #include <stdio.h> const int N = 50005; int pre

python模块之logging

在现实生活中,记录日志非常重要.银行转账时会有转账记录:飞机飞行过程中,会有黑盒子(飞行数据记录器)记录飞行过程中的一切.如果有出现什么问题,人们可以通过日志数据来搞清楚到底发生了什么.对于系统开发.调试以及运行,记录日志都是同样的重要.如果没有日志记录,程序崩溃时你几乎就没办法弄明白到底发生了什么事情.举个例子,当你在写一个服务器程序时,记录日志是非常有必要的.下面展示的就是 EZComet.com 服务器的日志文件截图. 服务崩溃后,如果没有日志,我几乎没办法知道到底发生了错误.日志不仅对于

mybatis实现CRUD操作和优化代码及调试(mysql数据库)(三)

继续(二)说 1.工程结构 2.新建db.properties文件(我的数据库没有设置密码) driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis name=root password= 3.log4j.jar加入工程并添加log4j.xml文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:conf

spring security+mybatis+springMVC构建一个简单的项目

1.引用 spring security ,这是一种基于spring AOP和Servlet的过滤安全框架.它提供全面的安全性解决方案,同时在web请求级和方法的调用级处理身份确认和授权.在spring framework基础上,spring security充分利用了依赖注入(DI,Dependency Injection)和AOP技术. 下面就让我们用一个小的晓得项目来出初步了解Spring Security 的强大功能吧. 2.项目实战    1)项目的技术架构:maven+spring

升级个人网站框架组件IBatisNet+Castle

<sqlMap namespace="Sequence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:noNamespaceSchemaLocation="SqlMap.xsd"> -- </sqlMap> 更改为 <?xml version="1.0" encoding="UTF-8" ?> &l

java中log4j的使用体验

log4j相信大部分java开发者都已经很熟悉了,在此记录下自己的使用过程. 一.文件准备: 1.log4j.jar(我这里使用的版本是log4j-1.2.17.jar,在附件中提供下载) 2.log4j配置,可以使用xml或properties文件进行配置,推荐使用xml形式的配置,方便灵活还直观,一个完整的log4j.xml参考配置文件如下所示: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE

C++中的log

<C++.Java.JavaScript中的日志(log)>中讲了日志的概念和应用场景,本文将进一步讲讲C++中日志记录的具体用法.C++中有很多记录log的库,比较常用的有log4cpp(log4cxx).Google Glog .下面主要讲一个log4cpp(log4cxx)的用法. log4cxx是apache软件基金会的一个开源库,是由log4j移植过来的跨平台的日志处理跟踪项目.从官网下载的log4cxx只有源码,需要自己编译. log4cxx的编译 1.下载apache-log4c

Android应用setContentView与LayoutInflater加载解析机制源码分析

[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 1 背景 其实之所以要说这个话题有几个原因: 理解xml等控件是咋被显示的原理,通常大家写代码都是直接在onCreate里setContentView就完事,没怎么关注其实现原理. 前面分析<Android触摸屏事件派发机制详解与源码分析三(Activity篇)>时提到了一些关于布局嵌套的问题,当时没有深入解释. 所以接下来主要分析的就是View或者ViewGroup对象是如何添加至应用程

Python(2.7.6) 标准日志模块 - Logging Handler

Python 标准日志模块使用 Handler 控制日志消息写到不同的目的地,如文件.流.邮件.socket 等.除了StreamHandler. FileHandler 和 NullHandler 定义在 logging 模块中,其他的 Handler 均定义在  logging.hangdlers 模块中.这些 Handler 是:WatchedFileHandler.RotatingFileHandler.TimedRotatingFileHandler.SocketHandler.Dat