Hacking/Reversing

[Whois 정보보안교육] Reversing Hand-Ray 과제

chipkkang 2021. 10. 13. 20:44

어셈블리 명령어 정리


명령어 사용법 의미 예시
mov mov A, B; B의 값을 A에 넣어라. mov rax, rbx;
mov DWORD[rax], ebx;
lea lea A, B; B의 주소값을 A에 넣어라. lea rax, [ebx];
add add A, B; A의 값을 B만큼 증가하라. add ecx, 0x10;
add BYTE[rbx], al;
sub sub A, B; A의 값을 B만큼 감소하라. sub ecx, 0x10;
sub BYTE[rbx], al;
inc inc A; A의 값을 1만큼 증가시켜라. inc rax;
dec dec A; A의 값을 1만큼 감소시켜라. dec rbx;
xor xor A, B; A와 B를 XOR한 값을 A에 저장하라. xor rax, rax;
and and A, B; A와 B를 AND한 값을 A에 저장하라. and rax, rbx;
or or A, B; A와 B를 OR한 값을 A에 저장하라. or rax, rbx;
cmp cmp A, B; A와 B를 비교하라. cmp rax, rbx;
jmp jmp A rip의 값을 A로 설정하라. jmp 0xdeadbeef;
call call A; A를 호출한다. call 0xdeadbeaf;
push push A; A의 값을 스택에 넣어라. (WORD 단위) push rax;
pop pop A; 스택에서 하나의 WORD를 뽑아, A에 넣어라. pop rax;
ret ret; 함수 끝나서 돌아갈 때. Ret;
cdq cdq edx 레지스터의 값이 0x0으로 셋팅한다. cdq
imul imul A, B, C; B와 C의 곱을 A에 저장한다. imul esi, edi, 25;
rep rep; ecx 레지스터에 담긴 카운터 횟수만큼 반복한다. rep stos dward ptr [edi];

 

 

Q1.


push   ebp
mov    ebp,esp
sub    esp,0x10
mov    DWORD PTR [ebp-0x4],0xa
mov    eax,DWORD PTR [ebp-0x4]
mov    DWORD PTR [ebp-0x8],eax
mov    eax,DWORD PTR [ebp-0x8]
imul   eax,eax,0x17
mov    DWORD PTR [ebp-0x8],eax
mov    eax,DWORD PTR [ebp-0x8]
sub    eax,DWORD PTR [ebp-0x4]
mov    DWORD PTR [ebp-0xc],eax
mov    eax,DWORD PTR [ebp-0xc]
cdq
idiv   DWORD PTR [ebp-0x4]
mov    DWORD PTR [ebp-0x4],eax
mov    eax,0x0
leave
ret
int A = 10, B;
B = A;
B *= 0x17; // 23 (10진수)
B -= A;
int C;
C = B;
C /= A;
A = B;
B = 0x0;
return;

 

Q2.


push   ebp;
mov    ebp,esp;
sub    esp,0x3fc;
mov    DWORD PTR [ebp-0x400],0x0;
lea    edx,[ebp-0x3fc];
mov    eax,0x0;
mov    ecx,0xf9;
mov    edi,edx;
rep stos DWORD PTR es:[edi],eax;
lea    eax,[ebp-0x400];
mov    DWORD PTR [eax],0x6c6c6548;
mov    DWORD PTR [eax+0x4],0x6f57206f;
mov    DWORD PTR [eax+0x8],0x21646c72;
mov    DWORD PTR [eax+0xc],0x4f48570a;
mov    DWORD PTR [eax+0x10],0x4a205349;
mov    DWORD PTR [eax+0x14],0x474e414a;
mov    WORD PTR [eax+0x18],0x217e;
mov    BYTE PTR [eax+0x1a],0x0;
sub    esp,0xc;
lea    eax,[ebp-0x400];
push   eax;
call   0x8049030;
add    esp,0x10;
mov    eax,0x0;
leave;
ret;
int A = 0; // ebp-0x400 == A
// edx = &ebp-0x3fc
// eax = 0x0, ecx = 0xf9, edi = edx;
// eax = &ebp-0x400
A = 0x6c6c6548;
*[A + 0x4] = 0x6f57206f;
*[A + 0x8] = 0x21646c72;
*[A + 0xc] = 0x4f48570a;
*[A + 0x10] = 0x4a205349;
*[A + 0x14] = 0x474e414a;
*[A + 0x18] = 0x217e; (Word는 2byte 크기)
*[A +0x1a] = 0x0; (BYTE는 1byte 크기)
// esp -= 0xc, eax = &ebp-0x400

puts();
// esp += 0x10;
// eax = 0x0;

return 0;