LLVM 學習笔记
LLVM 學習今天+第二天早上完成了https://llvm.org/docs/tutorial/MyFirstLanguageFrontend/LangImpl01.htmlhttps://llvm.org/docs/tutorial/MyFirstLanguageFrontend/LangImpl02.html
儅我表面上明白了詞法分析與語法分析,寫出來的的代碼卻非常混亂。
思考了一下,發現我非常容易疏忽于什麽時候應該gettok,異常處理,解析后有問題的地方應該返回nullptr,應該用什麽樣的代碼處理產生式。
最後寫出來代碼還是和提供的代碼沒什麽差別,在某些地方對字符串的解析并不完全。
貼一下我認爲非常精妙的代碼
// Parse oprhs::(op primary)*
static std::unique_ptr<ExprAST> ParseBinOpRHS(int ExprPrec, std::unique_ptr<ExprAST> LHS) {
while (true) {
auto TokPrec = GetTo ...
LLVM 學習笔记
LLVM 學習LLVM 全稱是 Low Level Virtual Machine,開始時還不太理解 LLVM 到底有啥用,爲什麽這麽好用。
衆所周知 gcc 也可以劃分爲相應的 前端 中端 後端。爲什麽 gcc 沒有 llvm 怎麽好用,可見 llvm 的結構設計的比較優秀,非常適合代碼 reuse。把 AST 等 IR 做了隔離,讓我們可以非常方便的利用 IR 做一些工作。
接下來我打算從前端開始學習 LLVM 的源碼。 我認爲(書上寫的)還是先試一下這個 reuse 的特性。To be honest,之前并沒有學過 cmake,遇到問題了,基本也只是在源代碼的上面進行一點修改,並不需要掌握這個能力,趁現在我們也可以學習鞏固一番相關的知識。
今天不知道爲什麽效率有一點低,可能早上被 4 節思政課折磨的緣故,下午就看了會兒漫畫打了會鐵道,晚上再吃一個肯爺爺(鐵道周邊),穿插一些 b 站短視頻。有一絲絲罪惡感。
晚上稍微對 AST 進行了一點思考,LLVM 爲什麽要把諸如 “詞法分析” “語法分析” ”語義分析“ 進行一定的抽離,只是爲了代碼復用嗎,既然要代碼復用,他的目的是什麽呢,如 ...
LLVM 學習笔记
看到以前的一篇日期是2020年,一些情感如鯁在喉。好久沒有寫筆記了,接下來準備重啓筆記計劃,可能也會偷偷發發論文筆記
LLVM 學習LLVM 版本commit ea42c4ac6a24c28fc12d5373a851ff376ea452cf (HEAD -> main)
Author: Paul Walker <paul.walker@arm.com>
Date: Fri Sep 8 16:14:58 2023 +0000
[SVE] Precommit test to show missing initialisation of call operand.
When calling func_f8_and_v0_passed_via_memory the memory used to
hold the first vector operand is allocated but not initialised.
LLVM 源碼結構├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LI ...
HGAME2022_partialPWN
直接进行一手记录,因为 pwn 太菜所以必须好好记录一下。队友也给我好多帮助,感激不尽。
enter_the_evil_pwn_land看了 chuj 的解法之后才发现 pwn 的工具好丰富,为什么以前我会写的那么艰涩(很普通的栈溢出,但是要绕过 canary,大致有两种方法,一种是直接覆盖到 TLS 结构体里面的 stack_guard,而 TLS 结构体在栈的高地址处,如果能输入的范围很大,就可以直接覆盖。另外一种就是泄露,格式化字符串等手段。
typedef struct
{
void *tcb; /* Pointer to the TCB. Not necessarily the
thread descriptor used by libpthread. */
dtv_t *dtv;
void *self; /* Pointer to the thread descriptor. */
int multiple_threads;
int gscope_flag;
uintptr ...
DX12 第八章学习
DX12-8th算是复习一点 games101 的东西了。
2.2变换法向量,证明过程使用 unT = u·n 蛮有意思
4朗伯余弦定理,辐射通量(radiant flux),辐照度(irradiance)。
5漫反射(diffuse)
6环境光(ambient),用于简单模拟其他物体反射过来的间接光照
7Fresnel equations(菲涅尔等式),Schlick approximation
粗糙度(roughness),镜面瓣(specular lobe)镜面反射光(specular )
8总结了光照模型的概述
指向光源的向量表面法线光向量和观察向量之间的中间向量入射环境光量入射直射光量根据表面反射率反射的入射光量朗伯余弦定理中间向量与光向量之间的夹角根据菲涅尔效应,关于中间向量所反射到观察者眼中的光量控制表面粗糙度指定和之间的所有微平面片段的分布情况(所占比例)镜面反射过程中,为了模拟能量守恒所采用的归一化因子
在书中的着色器代码中也控制了 n·h 非负
9一些名词光泽度(shininess)粒度(granularity)
16.1Mo ...
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 ...