Dll INJECTION && HOOK
DLL INJECTION && HOOK
《关于我一本书看到一半却咕了一个学期这件事》
粗略的看了一下,dll injection 和 hook 发现这俩应该是得放一起的,因为涉及的知识比较难做分隔,或者说基础知识很是接近,越是了解,就会发现越要了解 windows 的 loader 机制,windows 的一些较为有用的 api ,甚至是 windows 的内核数据结构,直接深入 windows 的 r0 还是比较猛的。
也因此这篇文章注定是随着我的学习不断更新的。
1.使用拓展最后一个节区进行注入已经写好的的DLL
这个在运行被注入的 notepad 的过程中,DLL 中的 Msg 并不会运行,只是通过 dllenterpoint 函数执行了 dllmain ,后者调用了 msgbox,弹出一个msgbox 窗体。
text 中的 0x7800 -> 0x7748 也就是肯定没有 7800 那么多数据,因此后面的可以写入的就是 0x7800-0x7748。不过不够我要的 IIT 就是了。分析给的 notepad 可以知道 ,为了不影响程序的正常运行,我们 ...
CALL_CONVENTION
CALL_CONVENTIONMSVC为了让两个不同调用约定的能够互相调用,由于不同调用约定对于符号的不同修饰,我选择使用 dll 手动修改导入符号,防止符号错乱的问题。
这篇文章介绍了 MSVC 下各种调用约定。同一种调用约定在不同指令集架构下也是有区别的。https://docs.microsoft.com/en-us/cpp/build/reference/gd-gr-gv-gz-calling-convention?view=msvc-160其中有一个 vectorcall 似乎是为了优化而使用的。
0x01//CdeclCall.c
#include <stdio.h>
//__declspec(dllexport)
void __cdecl foo(int a,int b){
printf("a = %d , b = %d ",a,b);
}
//FastCall.c
__declspec(dllimport) void __fastcall foo(int,int);
int main(){
foo(1,2 ...
HGAME-FINAL-RE
hgame_final by RogerThat 对于这道题目有好两个思路可以进行,其一是直接进入程序,在逆向过程中会遇到一个接管几乎全部程序的 switch 结构。很典型的直冲直撞逆向手(在没有 hint 的情况下)。
在我这边的环境下这个函数在 sub_7FF6A2994F44
可以看出,这个代码很难看懂,但是可以看出他的分支有 46 种,一般出现这么长的 switch 结构是很有问题的,而且根据我的分析,调用不同的 switch 他会调用函数等等,输出出
Welcome to HGAME final!
what is your flag?
在一开始不知道这个和 lua 的情况下焦头烂额,因为想分析这个虚拟机难度非常高,后来我也只是在源码的帮助下才勉强理解。一开始通过 x64_dbg 自带的条件断点,我让他输出出了 siwtch 的分支。
具体的 OPCODE 我就不展示了,很长很长,而且大部分都是 case 1。
但是当我知道了它和 lua 有关,那就不一样了,内置的虚拟机必然会去执行 lua 代码,或者 lua 2 luac.out 的字节码。这个代码其实就是在 p ...
HGAME_WEEK3_WP
WEEK3-RogerThat WP萎了萎了,没时间做pwn了(游戏玩多了)
ReFAKE乱打一通,拿了一个假flag,没注意到init函数对调试器操作了一波。
这里应该是检测了是否有debugger,通过文件系统来达成,在windows中估计就是IsDebugger了,也可能有别的骚操作,暂且没见着,大胆猜测可以有多进程通信检测什么的。
针对这个比较简单的加密函数有脚本
#include <idc.idc>
static main(){
auto addr = 0x401216;
auto i = 0;
for(i = 0;i<0x43E;i++){
PatchByte(addr+i,Byte(addr+i)^Byte(0x409080+i));
}
}
解密后得到真正的比较函数
__int64 __fastcall sub_401216(__int64 a1)
{
int v2[36]; // [rsp+8h] [rbp-1D0h]
int v3[36] ...
HGAME_WEEK2_WP
WEEK2-WriteUpReezapk为了做这个题目我找了好多好多工具ToT
最后免费的我推荐jadx 或者jeb demo。不过jadx有些地方还是反编译不出来,很难看懂,似乎是和类型有关的部分。最后一个能打的都没有,最后跑去找到了 jeb pro用。相当的给力,虽然这道题理论上可以看字节码,也有教程讲java的字节码,但是——正经人谁看字节码呀!
在付费面前,一个能打的都没有/doge(
在逆的过程中找到“Again?”字符串,定位到button的方法上
经过一番调教,找到MainActivity.s是一个加密函数,继续挖掘。找到
用的AES-CBC,key是SHA-256(“A_HIDEN_KEY”),IV是MD5(“A_HIDEN_KEY”),上脚本咯
from __future__ import absolute_import, division, unicode_literals
from Crypto.Cipher import AES
import hashlib
from binascii import unhexlify
import base64 ...
HGAME_WEEK4_WP
WEEK4-RogerThat WP这周有点寒碜,只有三道题
Revm这道题是一道虚拟机相关的题目,因此分许需要花不少时间,在没做出来之前也慢慢试着写点东西,希望也能有所收获。
首先寻找到main函数
int __cdecl main(int argc, const char **argv, const char **envp)
{
FILE *v3; // rax
int v4; // eax
const char *v5; // rcx
char Buffer[40]; // [rsp+20h] [rbp-38h] BYREF
puts("Welcome to ovm++!");
j_inilization();
puts("Input your flag: ");
v3 = _acrt_iob_func(0);
fgets(Buffer, 35, v3);
j_printf_("Your flag is: %s\n", Buffer);
puts("VM started successfully!");
j_vm_fun ...
HGAME_WEEK1_WP
WEEK1-RogerThatWebHitchhiking_in_the_Galaxywatermelon这瓜,实在是顶,一开始根本找不到它在哪实现的检测。另外一方面,等检验分数的时候已经是到顶了,但是到顶可太慢了,就算一个一个叠上去也可能掉下来。上截图:
宝藏走私者http-headers,也不清楚为什么复现不了,记得是改了host,referer,X-Forwarded-For,Client-IP。
智商检测鸡(来比划比划)我的思路就是自动去算积分,好久没码代码实在有点难顶
import requests
from sympy import *
import re
x = symbols('x')
a = 12
b = 8
min = -77
max = 70
url_string1="http://r4u.top:5000/api/verify"
url_string2="http://r4u.top:5000/api/getQuestion"
url_string3="http://r4u.top:5000/api/getStatus"
url_flag = "htt ...
findkey
findkey write_up
没想到给小明神秘盒子的论坛高手居然是本次ctf的策划人之一,在比赛的时候,神秘盒子再一次出现,小明下意识的再次重复之前的操作,结果显而易见得失败了,赶紧帮小明解答这个加了点佐料的盒子。 注意:得到的 flag 请包上 flag{} 提交
最近闲来事贼多,做一题逆向暂且表示自己是个re手(文明六超好玩)
打开一看,这不是微软的模板嘛,file选中可以下滑找到exit,help选中下滑有一个about,打开都没什么东西。怪不得叫做findkey。此时题目可能做什么我稍微清楚了点,不过由于我开发的少,所以中间还是有不少波折。
这时候打开ida看看。从WinMain()入手。
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
CHAR Buffer[100]; // [esp+4Ch] [ebp-84h] BYREF
HACCEL hAccTable; // [esp+B0h] [eb ...
反调试之去除硬件断点
反调试之去除硬件断点首先介绍几个X86下调试寄存器D0…D7,已经没有D4,D5了在wiki上说是被D6,D7取代了。
D0…D3
Each of these registers contains the linear address associated with one of four breakpoint conditions. Each breakpoint condition is further defined by bits in DR7.
The debug address registers are effective whether or not paging is enabled. The addresses in these registers are linear addresses. If paging is enabled, the linear addresses are translated into physical addresses by the processor’s paging mechanism. If paging is not ena ...
marked-book
windows systemWindows内核原理与实现Windows 内核设计思想DirectX12introduction to 3d game programming with directx 12