南邮ctf答案php是世界,南邮ctf训练平台逆向试题wp
第一題:
hint已經給的很明白了: IDA 進去 ,對那堆數字按R 就好
第二題:low_addr???rsp
0x1
0x4???相對地址
0x18
0x1c
high_addr??rbp
00000000004004e6?:
4004e6:?55????????????????????push???rbp
4004e7:?48?89?e5??????????????mov????rbp,rsp
4004ea:?48?89?7d?e8???????????mov????QWORD?PTR?[rbp-0x18],rdi?????4個字=8個byte=64bit?rdi存參數?rdi是64位寄存器?存第一個參數
4004ee:?89?75?e4??????????????mov????DWORD?PTR?[rbp-0x1c],esi?????esi是32位寄存器??存第二個參數??esi能存兩個字
4004f1:?c7?45?fc?01?00?00?00??mov????DWORD?PTR?[rbp-0x4],0x1??????向內存?[rbp-0x4]?寫入1
4004f8:?eb?28?????????????????jmp????400522?
4004fa:?8b?45?fc??????????????mov????eax,DWORD?PTR?[rbp-0x4]??????DWORD?PTR?[rbp-0x4]這個指針代表數值為1的地方。eax=1
4004fd:?48?63?d0??????????????movsxd?rdx,eax????????????????????????movsxd帶符號擴展并傳送?????rdx=1
400500:?48?8b?45?e8???????????mov????rax,QWORD?PTR?[rbp-0x18]?????rax=input首址
400504:?48?01?d0??????????????add????rax,rdx??????????????????????rax=input首址+1?input[1]
400507:?8b?55?fc??????????????mov????edx,DWORD?PTR?[rbp-0x4]??????edx=1
40050a:?48?63?ca??????????????movsxd?rcx,edx????????????????????????rcx=1
40050d:?48?8b?55?e8???????????mov????rdx,QWORD?PTR?[rbp-0x18]?????rdx=input首址
400511:?48?01?ca??????????????add????rdx,rcx????????????????????????rdx=input首址+1?input[1]
400514:?0f?b6?0a??????????????movzx??ecx,BYTE?PTR?[rdx]????????????????????ecx=?0x67
400517:?8b?55?fc??????????????mov????edx,DWORD?PTR?[rbp-0x4]???????????????edx=1
40051a:?31?ca?????????????????xor????edx,ecx?????????????????????edx=0x67?^?0x1?=?0x66??=?'f'
40051c:?88?10?????????????????mov????BYTE?PTR?[rax],dl
40051e:?83?45?fc?01???????????add????DWORD?PTR?[rbp-0x4],0x1?????????????[rbp-0x4]?處的值?+?1
400522:?8b?45?fc??????????????mov????eax,DWORD?PTR?[rbp-0x4]????[rbp-0x4]??處的值讀入eax
400525:?3b?45?e4??????????????cmp????eax,DWORD?PTR?[rbp-0x1c]???eax和28相比
400528:?7e?d0?????????????????jle????4004fa?????????小于28的話就跳到4004fa處
40052a:?90????????????????????nop
40052b:?5d????????????????????pop????rbp
40052c:?c3????????????????????retint?main(int?argc,?char?const?*argv[])
{
char?input[]?=?{0x0,??0x67,?0x6e,?0x62,?0x63,?0x7e,?0x74,?0x62,?0x69,?0x6d,
0x55,?0x6a,?0x7f,?0x60,?0x51,?0x66,?0x63,?0x4e,?0x66,?0x7b,
0x71,?0x4a,?0x74,?0x76,?0x6b,?0x70,?0x79,?0x66?,?0x1c};
func(input,?28);
printf("%s\n",input+1);
return?0;
}
1. ? mov ax,bx ;? 是把BX寄存器“里”的值賦予AX,由于二者都是寄存器,長度已定(word型),所以沒有必要加“WORD”? ????? mov ax,word ptr [bx];?? 是把內存地址等于“BX寄存器的值”的地方所存放的數據,賦予ax。由于只是給出一個內存地址,不知道希望賦予ax的,是byte還是word,所以可以用word明確指出;如果不用,既(mov ax, [bx];?? )則在8086中是默認傳遞一個字,既兩個字節給ax。
2.
r代表64位 e代表32位,一個char占用一個字節
3.
一個函數被調用,首先默認要完成以下動作:??? 將調用函數的棧幀棧底地址入棧,即將bp寄存器的值壓入調用棧中??? 建立新的棧幀,將被調函數的棧幀棧底地址放入bp寄存器中以下兩條指令即完成上面動作:push %rbpmov? %rsp, %rbp???? ptr -- pointer (既指針)得縮寫。???? 匯編里面 ptr 是規定 的 字 (既保留字),是用來臨時指定類型的。? (可以理解為,ptr是臨時的類型轉換,相當于C語言中的強制類型轉換)
PS:
第一次讀匯編代碼......感覺還挺有意思的,都是邊查資料邊看,,最坑的是最初認為函數參數里邊,棧存的直接是字符串,,后來分析一半感覺不對勁....原來存的是字符串的地址 ...我擦...
最后附上python小程序:a?=?[0x67,0x6e,0x62,0x63,0x7e,0x74,?0x62,?0x69,?0x6d,?0x55,?0x6a,?0x7f,?0x60,?0x51,?0x66,?0x63,?0x4e,?0x66,?0x7b,0x71,?0x4a,?0x74,?0x76,?0x6b,?0x70,?0x79,?0x66?,?0x1c]
b?=?""
for?x?in?range(1,29):
b=b+chr(a[x-1]?^?x)
print?b
flag{read_asm_is_the_basic}
總結
以上是生活随笔為你收集整理的南邮ctf答案php是世界,南邮ctf训练平台逆向试题wp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工业计算机和PLC的区别
- 下一篇: Prometheus源码学习(4) 通过