其他
茴字的三种写法之angr符号执行寻找Flag
本文为看雪论坛优秀文章
看雪论坛作者ID:xuada
前言
一、angr简介
1.1 angr的定义
二、05_angr_symbolic_memory
2.1 程序初探
int __cdecl main(int argc, const char **argv, const char **envp)
{
signed int i; // [esp+Ch] [ebp-Ch]
memset(user_input, 0, 0x21u);
printf("Enter the password: ");
__isoc99_scanf("%8s %8s %8s %8s", user_input, &unk_A1BA1C8, &unk_A1BA1D0, &unk_A1BA1D8);
for ( i = 0; i <= 31; ++i )
*(_BYTE *)(i + 169583040) = complex_function(*(char *)(i + 169583040), i);
if ( !strncmp(user_input, "NJPURZPCDYEAXCSJZJMPSOMBFDDLHBVN", 0x20u) )
puts("Good Job.");
else
puts("Try again.");
return 0;
}
2.2 angr执行之地址搜索法
import angr,claripy,sys
proj = angr.Project('05_angr_symbolic_memory')
init_state = proj.factory.entry_state()
.text:0804865B push offset s ; "Try again."
.text:08048660 call _puts
.text:08048665 add esp, 10h
.text:08048668 jmp short loc_804867A
.text:0804866A ; ---------------------------------------------------------------------------
.text:0804866A
.text:0804866A loc_804866A: ; CODE XREF: main+AE↑j
.text:0804866A sub esp, 0Ch
.text:0804866D push offset aGoodJob ; "Good Job."
.text:08048672 call _puts
.text:08048677 add esp, 10h
good_addr = 0x0804866A
bad_addr = 0x0804865B
sim = proj.factory.simgr(init_state)
sim.explore(find=good_addr,avoid=bad_addr)
<SimulationManager with 1 active, 64 deadended, 1 found>
solution = sim.found[0]
solution.posix.dumps(0)
b'NAXTHGNR JVSFTPWE LMGAUHWC XMDCPALU',刚好四个字符串,每个8个字节长,程序真实运行并输入以上字符串。
让angr寻找到达具体地址的方法是一个不错的符号执行寻找flag的方法,除了地址还有其他方法吗,答案是有的,angr的强大之处不仅仅是可以搜索达到地址条件的状态,还可以根据多种多样的约束条件进行执行。接下来是根据程序的标准输出进行判断搜索。
2.3 angr执行之标准输入搜索法
def is_success(state):
std_out = state.posix.dumps(1)
if b'Good Job.' in std_out:
return True
else :
return False
def is_false(state):
std_out = state.posix.dumps(1)
if b'Try again.' in std_out:
return True
else:
return False
sim.explore(find=is_success,avoid=is_false)
sim.found[0].posix.dumps(0)
2.4 angr执行之内存写入法
.text:080485F4 push offset a8s8s8s8s ; "%8s %8s %8s %8s"
.text:080485F9 call ___isoc99_scanf
.text:080485FE add esp, 20h
.text:08048601 mov [ebp+var_C], 0
start_addr = 0x08048601
init_state = proj.factory.blank_state(addr=start_addr)
password3_address = 0x0A1BA1D8
password2_address = 0x0A1BA1D0
password1_address = 0x0A1BA1C8
password0_address = 0x0A1BA1C0
password0 = claripy.BVS('password0',64)
password1 = claripy.BVS('password1',64)
password2 = claripy.BVS('password2',64)
password3 = claripy.BVS('password3',64)
init_state.memory.store(password0_address,password0)
init_state.memory.store(password1_address,password1)
init_state.memory.store(password2_address,password2)
init_state.memory.store(password3_address,password3)
sim = proj.factory.simgr(init_state)
sim.explore(find=is_success,avoid=is_false)
pass0 = solution_state.se.eval(password0,cast_to=bytes)
pass1 = solution_state.se.eval(password1,cast_to=bytes)
pass2 = solution_state.se.eval(password2,cast_to=bytes)
pass3 = solution_state.se.eval(password3,cast_to=bytes)
print(pass0,pass1,pass2,pass3)
三、总结
看雪ID:xuada
https://bbs.pediy.com/user-home-829811.htm
*本文由看雪论坛 xuada 原创,转载请注明来自看雪社区。
本文参与了#看雪30天发帖打卡挑战#活动。
发帖见证成长,坚持见证不凡。
不仅可以收获进步,还可赢取物质奖励哦!
想要了解更多活动详情,戳 ↓
另外,贴心提示本次再印刷还没购买0day安全正版书籍的小伙伴抓紧时间啦!
目前已热销493本,满500本就可安排发货啦!
点击以下小程序即可预购!
推荐文章++++
求分享
求点赞
求在看