DX12 第七章习题
DX12-7th7th Capturesomething before 7记忆被清空了,有点搞不懂 worldViewProj 是怎么产生的了,还有 cb 是怎么绑定的?
world 就是物体在世界空间的位置
view 是物体从世界空间,变换到摄像机空间(视察空间)的矩阵
Proj 则是物体在视察空间中映射到二维平面上的矩阵
constant buffer 的绑定过程,以下是需要绑定的结构体
// 需要绑定的 CB
struct ObjectConstants
{
DirectX::XMFLOAT4X4 World = MathHelper::Identity4x4();
};
struct PassConstants
{
DirectX::XMFLOAT4X4 View = MathHelper::Identity4x4();
DirectX::XMFLOAT4X4 InvView = MathHelper::Identity4x4();
DirectX::XMFLOAT4X4 Proj = MathHelper::Id ...
DX12 第六章习题
DX12-6th6th Capture6.13.7Q: Merge the vertices of a box and pyramid (Exercise 4) into one large vertex buffer. Also merge the indices of the box and pyramid into one large index buffer (but do not update the index values). Then draw the box and pyramid one-by-one using the parameters of ID3D12CommandList::DrawIndexedInstanced. Use the world transformation matrix so that the box and pyramid are disjoint in world space
只要配置两个 submesh 以及在 drawIndexInstanced 的时候注意,遗憾的是我在分开两个的时候我是直接把他们坐标该改一下的。不大好
vi ...
SCTF 2021 ret2text
CheckIn_ret2text符号执行部分受限于对 angr 的理解以及不是很清楚一些高级接口,只能手糊一个 hook + state 携带输入字符串符号执行过程
因为代码写的比较杂凑为理解以下代码需要知道 state.memory 中 0x0 第一个字节存着多少次输入。0x100偏移之后每个0x100存储一个结构 { type:1bytes ,size:1bytes , str:size } 只能说是对症下药了。为了找到栈溢出,需要存储上一次输入字符串可以的长度,我保存在 input_str_off= 0x100000 。我的命名多少有点古怪,明明是个 size ,我把它命名成了 str_off …
要是有什么更好的写法,一定要告诉我呀~
2022/3/7 补充 hook 的写法可以写的简洁一些。这道题可以直接执行,不需要自己去控制程序流或者分析。找到非约束的状态直接求解输入即可。
import claripy
import angr
from angr import SimProcedure
import IPython
import archinf ...
Angr 学习与实践
Angrexamplelittle_engine | DONE
Script author: Michael Reeves (github: @mastermjr)Script runtime: 3 min 26 seconds (206 seconds)Concepts presented:stdin constraining, concrete optimization with Unicorn
映入眼帘的看上去应该是 CPP 编译的程序。似乎是因为一些优化或者语言本身的问题,简单的一个程序流,看上去极其诡异。动调后得知。程序会吞掉第一个输入的字符(字符的ascii要小于 0x7E)。然后剩下的是输入 flag ,flag 的长度是 75,不同函数之间通过 RDI 传递传出字符串等参数。在分析的时候会发现程序会把输入的字符串转储到 RDI 所指向的一个数据结构中。根据不同的长度进行不同的转储(我打赌源程序猿不可能写出这种东西)
然后经过一个简单的加密,不清楚什么算法,这部分通过 angr 当一个黑盒不管了。
最后通过在死亡的路径中,寻找输出流中存在 “Chugga” 的,就能 ...
RCTF Valgrind
Valgrind给的是 angr.SimState 对象在执行过程中输出的日志。由于网上资料也比较多,或许有些杂乱,我也做一些介绍。让大家也能快速上手。暂时就探索到这,有空再看看源码,再深入一些。
Angr : A powerful and user-friendly binary analysis platform!
一些介绍配置 angr 环境 https://docs.angr.io/introductory-errata/install
## 对于我的 wsl2
git clone https://github.com/angr/angr-dev
cd angr-dev
./setup.sh -i -e angr
## 要是有包下不来,挂个代理,或者手动下,都可以
## 接下来要配置 ~/.bashrc
export WORK_HOME = ~/.vituralenvs
source $(find / -name "virtualenvwrapper.sh")
## 这个也可以手动设置路径
## 发现 angr venv 中导入不了 angr
## 可以在 angr ve ...
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 ...