求教CIP是什么东西? 有三句代码打死也看不懂,球高手解答!
本帖最后由 冥界3大法王 于 2020-7-27 09:51 编辑https://www.lanzoux.com/iqYXOf0uu5a这个为测试程序
使用到的脚本
//start
msg "upx (3.91) unpacker" 这明白弹框信息
msg "make sure you're at the entry point of the program before you continue"这明白弹框信息
pause
//clear breakpoints
bc //清全部cc断点
bphwc //清全部硬件断点
//script start
step //单步
bphws csp,r//为csp设一个硬件访问断点,但csp? 有这个寄存器吗 ?
erun 无视异常运行
bphwc清全部硬件断点
//find oep jump 查找oep
find cip,"80E9" // 在内存页中 找代码码,cip又迷糊了,有这个寄存器???
cmp $result,0 //不太理解,看了帮助,也就知道 无非比较 两变量,细节糊涂。
je error
//go to OEP
bp $result+1
erun
bc
sti
//finish script
ret
error:
msg "didn't find oep jump"
ret
光标执行到 00409D56 | 8D4424 80 | lea eax,dword ptr ss:
也就是脚本 bp $result+1 说什么执行脚本出错
// Author: Thomas Thelen
// Contact: https://github.com/ThomasThelen
// Comment: Takes you to the OEP of files packed with UPX from versions 2.02 to 2.03
// Date: 8/12/2015
// Instructions: Open the file in x64dbg and run the script.
//Begin Script
run
bc
bphwc
//Find the OEP
find CIP, E91B33FFFF// Signature of OEP jump我不明白CIP是啥?无论是32位的调试器还是64位的了,哪有去?
我也试过 findallmem esp,"E9 98 72 FF FF"这样搜索一页变多页就只有一个结果了。但是问题来,如何把这个的结果传给$result ?
网上x32dbg中仅有那么几个少的可怜的破脚本,还没有一个入门的详解。
RAX : 00007FF793770100
RBX : 0000000000000000
RCX : 0000007E186C7000
RDX : 00007FF793770100
RBP : 0000000000000000
RSP : 0000007E1887F758
RSI : 0000000000000000
RDI : 0000000000000000
R8: 0000007E186C7000
R9: 00007FF793770100
R10 : 00000FFEF26EE020
R11 : 0000000100400000
R12 : 0000000000000000
R13 : 0000000000000000
R14 : 0000000000000000
R15 : 0000000000000000
RIP : 00007FF793770100
cmp $result, 0 // Check for success 帮助中所说比较两个数的结果 此命令比较两个表达式。请注意,当您要检查值是否更大或更小时,将进行arg1>arg2的比较。
如果此值的计算结果为true,则$_BS_FLAG将设置为1,表示该值更大。所以测试arg1是否大于/小于arg2。
arg1第一个要比较的表达式。
arg2要比较的第二个表达式。
je error // Error otherwise
bp $result // Set a breakpoint on the jump 这个是设一个断点(加上那个结果的变量) 怎么加,不明白。 我找了个upx3.95的做试验,卡住了。
run
st
sti // Take jump to OEP
bc // Clear Breakpoints
ret
error:
msg "Could not find the OEP."
ret
https://static.52pojie.cn/static/image/hrline/2.gif
// Author: Thomas Thelen
// Contact: https://github.com/ThomasThelen
// Comment: Takes you to the OEP of files packed with UPX from versions 3.06 to 3.09
// Date: 8/12/2015
// Instructions: Open the file in x64dbg and run the script.
//Begin Script
run
bc
bphwc
//Find the OEP
find CIP, E9BA31FFFF// Signature of OEP jump====》还是上面的那些问题。
cmp $result, 0 // Check for success
je error // Error otherwise
bp $result // Set a breakpoint on the jump
run
st
sti // Take jump to OEP
bc // Clear Breakpoints
ret
error:
msg "Could not find the OEP."
ret 本帖最后由 冥界3大法王 于 2020-7-27 10:07 编辑
看了下帮助,说有cip
所有的寄存器(所有大小)可以用来作为变量。
大多数寄存器的变量名称与它们的名称相同,但以下寄存器例外:
x87 控制字标志:该寄存器的标志被这样命名:_x87CW_UM
除了在架构中的寄存器外,x64dbg 还提供下列寄存器:CAX、CBX、CCX、CDX、CSP、CBP、CSI、CDI、CIP。这些寄存器在 32-位平台上被映射到 32-位寄存器,而在 64-位平台上被映射到 64-位寄存器。例如,CIP 在 32-位平台是 EIP,而在 64-位平台是 RIP。该功能为了能支持独立于体系结构的代码。
但cip指的是哪里呢?
当行脚本执行到红箭头行!
msg {cip},结果是00409D56
msg {$result} 的 执行结果为1
怎么才能让bp结果+变量得到bp00409D63 给这行下断点呢? 本帖最后由 oudaidai 于 2020-7-27 10:26 编辑
学习学习,下次不敢了 oudaidai 发表于 2020-7-27 10:20
非常感谢
@oudaidai
感谢个屁,我很多求助未解决还成了收藏{:301_1008:}
楼主是糊涂蛋,楼下是超级糊涂蛋, 错了还害死一窝。{:301_971:} oudaidai 发表于 2020-7-27 10:20
非常感谢
人家求助都没有找到回答 你感谢个毛啊 怕是灌水灌上瘾了 不忘初心哟 发表于 2020-7-27 10:24
人家求助都没有找到回答 你感谢个毛啊 怕是灌水灌上瘾了
sorry,我自己在学习selenium,试一下这种回帖方式 冥界3大法王 发表于 2020-7-27 10:23
@oudaidai
感谢个屁,我很多求助未解决还成了收藏
楼主是糊涂蛋,楼下是超级糊涂蛋, 错了 ...
sorry,我自己在学习selenium,试一下这种回帖方式,对不起 冥界3大法王 发表于 2020-7-27 10:23
@oudaidai
感谢个屁,我很多求助未解决还成了收藏
楼主是糊涂蛋,楼下是超级糊涂蛋, 错了 ...
笑死,本来想看看大神的解答呢 在PEDIY我也回了你,这里再回你一次。
我不知道你在纠接什么,这个CIP,在32位里面就是指的EIP,如果在64位上就是RIP,EIP里保存了CPU即将执行的指令的地址,重点,是指令的地址,它会不断增加的。你也看得到现在的地址是00409D56,因为脚本停在这里,这个地址里目前保存的数据是8D442480(在计算机里指令和数据是分不开的),4个字节,所以它的下一个地址就是00409D5A -4 =00409D56,脚本的意思,从这个地址开始查找这些指令,比对,如果找到了80E9,E9就是JMP指令的哈,就把保存有80E9指令的地址返回给result,很显然,这个地址是指向80,而不是E9,而我们需要在E9上下断,所以会有result+1的做法。其实这个脚本也可以改成这样:find cip,"E9"然后bp $result //下断在E9上,E9就是JMP啦,脚本作者可能是为了稳健才写成查找80E9的。你甚至可以改成:find cip,"E99872ffff" ,这样result应该会是地址409D63, 然后精确的在E9上下断,bp $result ,再乱搞一下,你甚至可以find cip,"75FA",然后bp $result+5 仔细看你贴子,难怪你得不到正确的result值,我晕,你自己看看,这条命令: find CIP, E9BA31FFFF// Signature of OEP jump====》还是上面的那些问题。
Result返回的是地址,绝对不会是1,要么是0,谁会给它1呢
页:
[1]
2