[paper learn] Symbolic execution with SYMCC: Dont interpret, compile!
IntroductionSYMCC替换了编译器 做了一些插桩
Background符号执行框架分为前端后端,前端负责计算expr 传递给后端的solver(e.g. Z3).Concolic execution和symbolic execution的主要区别在于它们如何处理程序中的条件分支语句。 在concolic execution中,程序的某些路径会被选择执行,这取决于之前执行过程中的输入值和执行顺序。然后,这些已经执行过的路径将会被记录下来,而未执行过的路径将会被探索并执行,以便发现程序中的错误。
所以CE的本质是记录输入下的路径和路径的约束条件 而不是直接利用CE求解一个路径。
目前的符号执行技术有两种形式
IR-based : 逐行对ir语句解释 进行符号计算 优点是任意实现 缺点是 远离机器码 IR到机器码的过程中应该还有问题
IR-less : 在机器码上通过CPU提供的功能对某些指令hook 能够跳转进自己的代码进行执行和分析 缺点就是指令很多 要对大部分指令都进行一个符号的处理 但是速度快
这里减少overhead的方法就是避免将只涉及到concrete valu ...
unicorn startup
目的是优化目标程序的fibonacci数列 从而快速解密
1234567(gdb) shell cat /proc/`pidof fibonacci`/maps00400000-00401000 r-xp 00000000 08:05 23233010 /home/squ/prac/unicore-prac/fibonacci00600000-00602000 rw-p 00000000 08:05 23233010 /home/squ/prac/unicore-prac/fibonacci7ffff7fc9000-7ffff7fcd000 r--p 00000000 00:00 0 [vvar]7ffff7fcd000-7ffff7fcf000 r-xp 00000000 00:00 0 [vdso]7ffff7fcf000-7ffff7fd0000 r--p 00000000 08 ...
idek-2022-sofirium
reverse1234567891011121314151617181920212200000000 sofiri_head struc ; (sizeof=0x7C, mappedto_3)00000000 unk db 112 dup(?)00000070 next dq ? ; offset00000078 total_count dd ?0000007C sofiri_head ends0000007C00000000 ; ---------------------------------------------------------------------------0000000000000000 sofiri_list struc ; (sizeof=0x108, mappedto_5)00000000 next dq ?00000008 buf db 256 dup(?)00000108 sofiri_lis ...
2021 redhat simpleVM
GitHub - fghcvjk/2021redhat: 第四届“红帽杯”网络安全大赛 - 初赛
对于llvm pwn需要三个组件 一个是opt 用于将一个对ir操作的规则so加载到一个lr or bc文件里。从而完成ir层面的处理。
而这里已经给了opt与so 我们要写的就是bc去利用这个opt。
123456[*] '/home/squ/prac/pwn/opt-8' Arch: amd64-64-little RELRO: Partial RELRO X Stack: No canary found X NX: NX enabled √ PIE: No PIE (0x400000) X
pass练习假设我要找到一个函数的所有调用
拿到一个function
遍历所有BasicBlock
遍历BB中的所有instruction
根据instruction构造一个CallBase 也就是这个instruction是存在调用的(如果dyn_cast不 ...
afl-forkserver-maneuver
forkserver的目的参见 lcamtuf.blogspot如果每次由fuzzer来进行fork-execve 那么每次目标程序都得进装载器链接器和动态加载库打一套 十分浪费时间。但是 如果我们劫持了目标程序的_start 让目标程序一开始执行我们写入的forkserver 代码,这样就能在装载之后通过COW实现低成本的fork。也就是forkserver本身就注入到目标程序里面去了,作为目标程序的起始点不断的进行fork。
trampoline这个被插桩到每个基本块之前
1234567891011121314151617181920static const u8* trampoline_fmt_64 = "\n" "/* --- AFL TRAMPOLINE (64-BIT) --- */\n" "\n" ".align 4\n" "\n" "leaq -(128+24)(%%rsp), %%rsp\n" "movq %%rdx, 0( ...
CVE-2022-0847-DIRTY-PIPE-detail
basic(之后会把docker做好传上去 以后就不用折腾了QAQ)https://hub.docker.com/repository/docker/squirre17/dirtypipe
page cacheLinux的换页机制是脏页机制,也就是写一个文件是通过写内存缓存页,然后标记脏位,在换页的时候一次性写回磁盘。而不是每次都写磁盘。在打开文件的时候可以用O_DIRECT | O_SYNC 来标记对脏页进行直写策略,换回同步。但这里并不是对文件进行硬存级别的篡改,假设文件进了内存,然后我修改了这个文件内存中的部分内容,短时间再次访问这个文件会直接从内存缓存中拿到我们篡改过的内容而不是去disk上取。
structsfilefs.h - include/linux/fs.h - Linux source code (v5.13-rc1) - Bootlin每一个打开的文件描述符和一个struct相对应
pipe_inode_info 指向一个内核管道1234567891011struct file {... struct path ...
debugger-impl
How debuggers work: Part 1 - Basics - Eli Bendersky’s website单纯的复现此文章。
single step首先是ptrace
12long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
对于第一个request的参数
PTRACE_TRACEME request, which means that this child process asks the OS kernel to let its parent trace it.
这个参数只用于子进程,所以这里是在fork之后
第三个对地址进行和第四个是地址操作相关,根据request的类型,是对这个addr进行poke,或者peek这个数据到data里(或者直接peek到返回值)。
Indicates that this process is to be traced by its parent. Any signal (except SI ...
Ghidra-INDIRECT-explanation
123456789undefined4 FUN_000114b8(void){ undefined4 in_r3; printf("%s(%d)\n","part_data_end",0x7d,in_r3,in_r3); return 0;}
output result as following (pcode-refined)
123456789(ram, 0x114d4, 4) INDIRECT (ram, 0x114d4, 4) , (const, 0x15, 4)(ram, 0x114d8, 4) INDIRECT (ram, 0x114d8, 4) , (const, 0x15, 4) --- CALL (ram, 0x10ba4, 8) , (ram, 0x114d8, 4) , (ram, 0x114d4, 4) , (const, 0x7d, 4) , (register, 0x2c, 4) , (register, 0x2c, 4)(register, 0x20, 4) COPY (const, ...
shared-memory-and-semaphore-machenism
分类
管道
消息队列
信号
共享内存
信号量
套接字
共享内存1234int shmget(key_t key, size_t size, int shmflg);void *shmat(int shmid, const void *shmaddr, int shmflg);int shmdt(const void *shmaddr);int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmget() returns the identifier of the System V shared memory segment associated with the value of the argument key. It may be used either to obtain the identifier of a previously created shared memory segment (when shmflg is zero and key does not have the value IPC_ ...
llvm-init
123sudo apt install lld-12sudo ln -s /lib/llvm-9/bin/llc /bin/llcsudo ln -s /lib/llvm-9/bin/opt /bin/opt
官方文档:LLVM Language Reference Manual — LLVM 16.0.0git documentation
1clang -Xclang -ast-dump -fsyntax-only test.c
生成AST
-S Only run preprocess and compilation steps
-emit-llvm Use the LLVM representation for assembler and object files
-c Only run preprocess, compile, and assemble steps (生成字节码的bc文件)
1clang -S -emit-llvm test.c
生成的ir中
12345d ...