tinytracer

  • 实践
    • CTF
    • 项目实践
  • 技术
    • C++
    • 逆向与汇编
    • 区块链安全
  • 探索
    • OWASP汉化
    • SQL
    • Kali
技术
逆向与汇编

基于异常的反调试实践

前言 最近在学习软件调试相关的内容,顺便举一反三找找反调试以及反反调试的相关方法。逛着逛着找到了这个网站:2种基于异常机制的反调试方法,虽然一看就知道不知道从哪转载的,而且搜索引擎有很多这篇文章一模一样的重复结果,但是代码倒是挺有趣的,研究玩玩。 第一题 第一段代码是基于IsDebugPresent()类似实现的反调试,代码如下 #include <windows.h> int AntiDebugInSEH(EXCEPTION_POINTERS* ExceptionInfo) { DWORD state…

2019年2月3日 1条评论 6782点热度 0人点赞 Chernobyl 阅读全文
逆向与汇编

硬件断点探幽

硬件断点 调试寄存器 IA-32处理器定义了8个调试寄存器,分别是DR0\~DR7。在32位模式下,它们都是32位的;在64位模式下为64位。 在32位模式下,DR4与DR5是保留的,当调试扩展(DE)功能被启用,即CR4的DE位为1时,任何对DR4与DR5的引用都会导致一个非法指令异常;当DE被禁用时,DR4和DR5分别是DR6与DR7的别名寄存器,等价于访问后者。寄存器的内容图示如下: DR0\~DR3为调试地址寄存器,长度与CPU位数一致 DR6为调试状态寄存器,64位时高32位保留未用 DR7为32位的调试…

2019年1月31日 0条评论 7429点热度 0人点赞 Chernobyl 阅读全文
逆向与汇编

软件断点探幽

软件断点 x86系列的处理器支持一条专门用来调试指令INT 3,也即是通常所说的“软件断点”,这条指令的目的是使CPU中断到调试器,以供调试者对执行现场进行分析。调试程序时,可以在可能有问题的地方插入INT 3指令。 INT 3 无论是Visual C++亦或是GCC都支持内联汇编指令,VC++示例如下: #include<iostream> int main() { int a = 0; __asm INT 3; std::cout << a << std::endl; std…

2019年1月29日 0条评论 7327点热度 0人点赞 Chernobyl 阅读全文
逆向与汇编

Windows x64 内存dump分析

前言 今天上午去上课前在虚拟机配置生产环境,没锁屏离开了宿舍。由于插着电源,电脑并不会自动进入休眠超时锁定账户。但是下课回来发现需要登陆——电脑重启了。重启的原因是什么?~~不会是被人日了吧~~,以后该如何避免这种蛋疼的情况呢? 信息收集 日志信息获取 系统的重启、程序的执行、警告等信息都会被系统日志所记录,先去系统日志看看情况。由于重启发生于上课时间,所以日志的记录时间区间很好确定,大约一个半小时。首先设置下筛选器,将该时间段内来自系统事件的信息呈现出来。 在事件列表中,确定了计算机关闭的时间,且计算机非正常关闭…

2018年12月20日 0条评论 7674点热度 2人点赞 Chernobyl 阅读全文
逆向与汇编

ROOTKIT初探——进程隐藏与混淆

预备知识请参阅RootKit 初探——文件隐藏与混淆 原理分析 概述 本次Rootkit教程 核心是Hook系统获取进程信息的函数ZwQuerySystemInformation。该函数未公开实现,官方文档所信息十分有限。通过RootKit修改系统调用该函数的函数指针,在获取进程信息时进行截流和修改。嗯,核心思想和上一期一样简单。 入口 ZwQuerySystemInformation的函数原型为: NTSTATUS NewZwQuerySystemInformation ( IN ULONG SystemInfo…

2018年10月22日 0条评论 3976点热度 0人点赞 Chernobyl 阅读全文
逆向与汇编

RootKit 初探——文件隐藏与混淆

RootKit 初探——文件隐藏与混淆 什么是Rootkit? Rootkit一词最早出现在Unix系统上。系统入侵者为了获取系统管理员级的root权限,或者为了清除被系统记录的入侵痕迹,会重新汇编一些软件工具(术语称为kit),例如ps、netstat、w、passwd等等,这些软件即称作Rootkit。其后类似的入侵技术或概念在其他的操作系统上也被发展出来,主要是文件、进程、系统记录的隐藏技术,以及网络数据包、键盘输入的拦截窃听技术等,许多木马程序都使用了这些技术,因此木马程序也可视为Rootkit的一种。 在…

2018年7月23日 0条评论 4220点热度 0人点赞 Chernobyl 阅读全文
逆向与汇编

C++与汇编——段与寄存器

段与寻址 段是在程序中专门定义的一个区域,它是一个包括代码、数据以及堆栈的区域。比如,用ida打开一个exe程序,在反汇编窗口中可以看到程序分成了如下几段: 0x00000----------- 代码段 0x10000----------- 数据段 0x20000----------- 堆栈段 0x26000----------- 段是从小段边界,即能够被16除尽的单元开始的。因此,当一条指令往一个段寄存器装入段地址时,会自动移去最右边的4位。你可以定义任何数据的段,想要访问特定的段,只需要改变适当段寄存器中的地址…

2018年7月19日 0条评论 5523点热度 0人点赞 Chernobyl 阅读全文
逆向与汇编

C++与汇编——四则运算

表达式求值 算数运算和赋值 算术运算又称四则运算,计算机中的四则运算和数学上的有些不同。 赋值 赋值运算类似于数学中的“等于”,是将一个内存空间中的数据传递到另一个内存空间中。该操作必须经过处理器访问并中转,以实现两个单元的数据传输。 在C++中,算数运算与其他传递计算结果的代码组合后才被视为一条有效的语句,因为只进行计算而没有传递结果的运算不会对程序结果产生任何影响,编译器将忽略该语句。如 6+4; int tmp = 0; 对应的汇编语句为 00401020 mov dword ptr [epb-4], 0 加…

2018年7月11日 0条评论 5395点热度 0人点赞 Chernobyl 阅读全文
C++

Effective Modern C++之旅——剖析auto变量

auto大法好 使用auto不仅可以少打些字,还能阻止那些由于手动指定型别带来的潜在错误和性能问题。另外,某些auto型别推导的结果在编程者的视角看起来是错误的,因此,有必要知道如何去引导auto推导出正确的结果。 我们从一段“天真无邪”的代码引入 int x; x忘记初始化了,所以它的值是不确定的,不过也不一定,它有可能被初始化为0。一切全看具体语境。 再来看一段不那么“天真”的代码 template<typename It> void dwim(It b, It e) { while(b != e)…

2018年6月9日 0条评论 3844点热度 0人点赞 Chernobyl 阅读全文
C++

Effective Modern C++之旅——探索编译器型别推导

掌握查看型别类型推导结果的方法 IDE编辑器 IDE中的代码编辑器通常会在你将鼠标指针悬停至某个程序实体,如变量、形参、函数等,会提示该实体的型别。例如下面的代码: const int exp = 42; auto x = exp; auto y = &exp; IDE会告诉你,x的型别是int,y是const int *。IDE推导类型的工作原理是让C++编译器(至少也是其前端)在IDE内执行一轮。如果该编译器不能在分析你的代码是得到足够的信息,自然也就无法得出型别推导的结果。对于像int这种内置的型别,…

2018年6月8日 0条评论 3256点热度 0人点赞 Chernobyl 阅读全文
123

COPYRIGHT © 2021 tinytracer.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang