彙編 sar與shr的坑爹之旅。

2021-07-07 09:18:54 字數 1432 閱讀 6094

一道簡單逆向題目卡了我好久。。(主要還是彙編太渣。

是關於sar和shr的具體功能不熟悉導致的。

組合語言中sar和shr指令都是右移指令,sar是算數右移指令(shift arithmetic right),而shr是邏輯右移指令(shift logical right)。

兩者的區別在於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...