angr系列
00_angr_find
01_angr_avoid
02_angr_find_condition
03_angr_symbolic_registers
04_angr_symbolic_stack
05_angr_symbolic_memory
06_angr_symbolic_dynamic_memory
07_angr_symbolic_file
08_angr_constraints
09_angr_hooks
10_angr_simprocedures
13_angr_static_binary
文章目录
scanf函数
#include<stdio.h>
int main() {
int buff[100];
scanf("%4s/n", buff);
printf("biaobiao come on");
scanf("%4s/n", buff);
}


总结:
scanf读取的地方是输入缓冲区(以内存为参照)的,只要第一个scanf读取完成后,缓冲区中还有数据,就会紧接着读取,不需要下次的输入。
分析伪代码


输入参数地址是0x0804A054

0x80486B3我们需要hook的地址是这个,因为这个函数里面字符进行一一比较,容易造成路径爆炸。
一旦我们执行到check_addr=0x080486B3这个地址时,然后程序不会往下执行原来的函数,而是会去执行check_hook函数
先进行函数参数的加载:
user_input_bvs=state.memory.load(
user_input_addr,
user_input_length
)
然后进行相应返回值的判断:
state.regs.eax=claripy.If(
desired==user_input_bvs,
claripy.BVV(1,32),
claripy.BVV(0,32)
)
脚本:
import angr
import sys
import claripy
def main(argv):
bin_path=argv[1]
p=angr.Project(bin_path)
init_state=p.factory.entry_state()
check_addr=0x080486B3
check_skip_size=5
@p.hook(check_addr,length=check_skip_size)
def check_hook(state):
user_input_addr=0x0804A054
user_input_length=16
user_input_bvs=state.memory.load(
user_input_addr,
user_input_length
)
desired='XYMKBKUHNIQYNQXE'
state.regs.eax=claripy.If(
desired==user_input_bvs,
claripy.BVV(1,32),
claripy.BVV(0,32)
)
def is_good(state):
return b'Good Job.' in state.posix.dumps(1)
def is_bad(state):
return b'Try again.' in state.posix.dumps(1)
sm=p.factory.simgr(init_state)
sm.explore(find=is_good,avoid=is_bad)
if sm.found:
found_state=sm.found[0]
print("Solution:{}".format(found_state.posix.dumps(0)))
else:
raise Exception("Solution not found")
if __name__=='__main__':
main(sys.argv)

ZXIDRXEORJOTFFJNWUFAOUBLOGLQCCGK
验证

本文详细解析angr库在scanf函数分析中的应用,涉及内存符号化、hook技巧和模拟执行,通过实例展示了如何利用angr工具定位输入缓冲区行为。重点介绍了如何hook scanf函数以控制输入并解决路径爆炸问题。
1967

被折叠的 条评论
为什么被折叠?



