由于要保证多操作系统下可用,所以覆盖掉的返回地址不能是堆栈中的地址,刚好后面的地址是文件的缓存指针,而且前两个字节xor 0x1C后变为EB 0x7C,只要修改0x7E处为相对跳转跳回缓存
区偏移量+8处的代码即可,前8字节应该是题目设计时就考虑过
缓存区偏移0处代码
00BD0000 /EB 7C jmp short 00BD007E
偏移7E处代码
00BD007E ^\EB 88 jmp short 00BD0008
便宜08处代码
00BD0008 B8 60024000 mov eax, 400260 ; ASCII "Failed!"
00BD000D C700 4F4B2100 mov dword ptr [eax], 214B4F
00BD0013 C740 08 4F4B210>mov dword ptr [eax+8], 214B4F
00BD001A 33C0 xor eax, eax
00BD001C 83EC 04 sub esp, 4
00BD001F 8BEC mov ebp, esp
00BD0021 83C5 24 add ebp, 24
00BD0024 68 83034000 push 400383
00BD0029 C3 retn
text.txt文件的前八个字节经过计算后eax需要等于0x0D才能保证修改ret的返回地址
加载vc32rtf后可以看到运算其实就是__int64的乘后取余,但由于第一步的相乘后产生了溢出,所以不能直接进行逆运算
由于给定的参数和0x10000000000000000的最大公约数为1,所以可以构造一个64位数使第一步的结果就为0x0D,这样第二步求余时由于0x0D小于给定的0x5BE6FF82A5164785,所以结果还是0x0D
求解使用的方法为寻找0x78CC02A869948F1B对0x10000000000000000的乘法逆元,e'=90B22DD80D53313
k=e'*d % f
k=0x7590C53F8AD397F7
所以文件的内容为
F7 97 D3 8A 3F C5 90 75 B8 60 02 40 00 C7 00 4F 4B 21 00 C7 40 08 4F 4B 21 00 33 C0 83 EC 04 8B
EC 83 C5 24 68 83 03 40 00 C3 90 90 90 90 90 90 F5 02 40 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 EB 88
长度 128字节
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)