一道簡單逆向題目卡了我好久。。(主要還是彙編太渣。組合語言中sar和shr指令都是右移指令,sar是算數右移指令(shift arithmetic right),而shr是邏輯右移指令(shift logical right)。是關於sar和shr的具體功能不熟悉導致的。
兩者的區別在於sar右移時保留運算元的符號,即用符號位來補足,而shr右移時總是用0來補足。
例如10000000算數右移一位是11000000,而邏輯右移一位是01000000。
loc_8048400:
mov ecx, eax
sar ecx, 1bh //就是這貨
shl eax, 5
xor eax, ecx
movzx ecx, byte ptr [edx]
add edx, 1
xor eax, ecx
cmp edx, ebx
jnz short loc_8048400
with
open('1','r') as f:
xx = f.read()
i=890
for x in xx:
i=((i>>0x1b)^(i<<0x5 & 0xffffffff)^ ord(x))& 0xffffffff
print hex(i)
raw_input()
之後通過gdb動態除錯得到每次迴圈的值進行比對,才發現出現錯誤的具體原因。sar在符號位為1時,右移時填充1,符號位為0時填充0。
而python預設的右移運算為邏輯右移運算,右移時預設填充0,與符號位無關。
with
open('1','r') as f:
xx = f.read()
i=890
l =
l1 =
for x in xx:
if(i&0x80000000):
i=((i>>0x1b | 0xffffffe0)^(i<<0x5 & 0xffffffff)^ ord(x))& 0xffffffff
else:
i=((i>>0x1b)^(i<<0x5 & 0xffffffff)^ ord(x))& 0xffffffff
s = ''
for x in l:
s += hex(x).replace('0x','').replace('l','')+'\n'
with
open('2','w') as f:
f.write(s)
print hex(i)
raw_input()
結果:0x7eeb184f
the end
彙編的樂與苦
這學期學彙編,剛開始時,學得很認真,老師布置的程式都能很快編出,這無疑給了我很大的信心。每每看到自己所寫的程式能編譯並執行出來,心裡有說不出的快樂,我想這就是我學會彙編的快樂吧。可是也有編譯成功但執行不出的,這時就比較痛苦了。因為根本就不知道錯在 對著程式,左查查右查查,還是查不出所以然來。比如最近...
彙編的進製與溢位
彙編的進製與溢位 對於無符號數來說,不存在溢位的問題,而對有符號數來說,不存在進製的問題 乙個位元組 8位 的數有256個 2的8次方 乙個字 16位 的數有65536個 2的16次方 8個二進位制位能夠表達的無符號數範圍是 0 255 16位表達的無符號數範圍是 0 65535 對於無符號數來說,...
c與彙編的關係
start是匯程式設計序的入口,main是c程式的入口?gcc 只是乙個 外殼而不是真正的編譯器,這真的c編譯器是 usr lib gcc i486 gun 4.3.2 cc1,gcc呼叫c編譯器 彙編器和鏈結器完成c 的編譯鏈結工作。usr lib gcc i486 linux gun 4.3.2...