# include <stdio.h>

int f(int param1, int param2)
{
 printf("test %d\n", param1+param2);
}
int main(void)
{
 void (*newF)(int v1, int v2) = f;
 __asm
 {
  push 20;
  push 10;
  call newF;
  pop  ebx;
  pop  ebx;
 }
 return 0;
}

'어셈블리' 카테고리의 다른 글

인라인 어셈블리 3개 값 받고 대소 비교  (0) 2017.10.23
이중 포인터 어셈블리 접근 방식  (0) 2017.10.22
인라인 어셈블리  (0) 2017.10.15
제곱 어셈블리  (0) 2017.10.13
어셈블리 함수 공부 중  (0) 2017.09.28

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=286482105


# include <stdio.h>


__declspec(naked) void main(void)

{

int sData;

int sumValue;

char* result;

char* s;

__asm

{ // stack prolog +++++++++++++++++++++++++++++++++++++

push ebp;

mov ebp, esp;

sub esp, 40h;

}

sData = 0; // esp += 4

result = "sum result :  %d\n";

s = "%d";

sumValue = 0;

__asm

{ // stack body +++++++++++++++++++++++++++++++++++++++

lea edi, sData; // 

push edi; // ( ,&sData);

push s; // ("%d", &sData);

call dword ptr[scanf]; // scanf("%d", &sData);

pop ebx;

pop ebx;


mov eax, sData;

mov ecx, eax;

L:// Label ++++++++++++++++++++++++++++++++++++++++++++

mov eax, ecx;

xor edx, edx; /* real import */

mov ebx, 2;

div ebx;

cmp edx, 0;

JZ jmpZero;

JNZ jmpNotZero;

jmpZero:

mov eax, ecx;

add sumValue, eax;

jmp EndPoint;

jmpNotZero:

jmp EndPoint;

EndPoint:


loop L;


push sumValue; // ( ,sumValue);

push result; // ("sum result :  ",sumValue);

call dword ptr[printf]; // printf("sum result :  ",sumValue);

}

__asm

{ // stack epilog +++++++++++++++++++++++++++++++++++++

mov esp, ebp;

pop ebp;

retn;

}

}

'어셈블리' 카테고리의 다른 글

이중 포인터 어셈블리 접근 방식  (0) 2017.10.22
인라이 어셈블리  (0) 2017.10.15
제곱 어셈블리  (0) 2017.10.13
어셈블리 함수 공부 중  (0) 2017.09.28
배열 어셈블리  (0) 2017.09.28

제곱 어셈블리

어셈블리2017. 10. 13. 13:17

# include <stdio.h>


int __pow__(int nParam)

{

__asm

{

mov eax, dword ptr ss : [ebp + 0x8];

mul eax; // eax *= eax

leave;

retn;

}

} // end of __pow__ function 

__declspec(naked) void main(void)

{

int num;

int resultValue;

char* prompt_1;

char* prompt_2;

char* prompt_3;

__asm

{

// [stack prolog ...]

push ebp;

mov ebp, esp; // ebp = esp

sub esp, 38h; // esp -= 38h

}

prompt_2 = "%d"; // esp 이동

prompt_1 = "Integer Input :  "; // esp 이동

prompt_3 = "pow(%d) result =>(%d) \n";

resultValue = 0;

__asm

{

// [stack body ...]

push prompt_1; // ("Integer Input :  ");

call dword ptr[printf]; // printf("Integer Input :  ");

pop ebx;


lea edi, num;

push edi; // (  ,&num)

push prompt_2; // ("%d", &num);

call dword ptr[scanf]; // scanf("%d", &num);

pop ebx;

pop ebx;


push num; // 

call dword ptr[__pow__];

mov resultValue, eax;

pop ebx;


push resultValue; // ( ,  , resultValue);

push num; // ( , num , resultValue);

push prompt_3; // ( "pow(%d) result =>(%d) \n" , num , resultValue);

call dword ptr[printf];

pop ebx;

pop ebx;

pop ebx;

}

__asm

{

// [stack epilog ...]

mov esp, ebp;

pop ebp;

ret;

}

}

'어셈블리' 카테고리의 다른 글

인라이 어셈블리  (0) 2017.10.15
인라인 어셈블리  (0) 2017.10.15
어셈블리 함수 공부 중  (0) 2017.09.28
배열 어셈블리  (0) 2017.09.28
인라인 어셈 함수 인자 전달  (0) 2017.09.27

gdb-peda$ disassemble main

Dump of assembler code for function main:

[ 스택 프롤로그 ]

   0x0804843c <+0>: push   ebp

   0x0804843d <+1>: mov    ebp,esp

   0x0804843f <+3>: sub    esp,0x8

////////////////////////////////////////////////////////////////////

   0x08048442 <+6>: mov    DWORD PTR [ebp-0x4],0xa
// int v1 = 10;

   0x08048449 <+13>: mov    DWORD PTR [ebp-0x8],0x14

// int v2 = 20;

   0x08048450 <+20>: push   DWORD PTR [ebp-0x8]

// 20

   0x08048453 <+23>: push   DWORD PTR [ebp-0x4]

// 10

   0x08048456 <+26>: call   0x804840b <f1>

// f1(10, 20)

   0x0804845b <+31>: add    esp,0x8

////////////////////////////////////////////////////////////////////

[ 스택 에필로그 ]
   0x0804845e <+34>: mov    eax,0x0

   0x08048463 <+39>: leave  

   0x08048464 <+40>: ret    

End of assembler dump.

////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////

gdb-peda$ disassemble f1
Dump of assembler code for function f1:
[ 스택 프롤로그 ]
   0x0804840b <+0>: push   ebp
   0x0804840c <+1>: mov    ebp,esp
   0x0804840e <+3>: sub    esp,0x8

////////////////////////////////////////////////////////////////////

   0x08048411 <+6>: mov    eax,DWORD PTR [ebp+0x8]
   0x08048414 <+9>: mov    DWORD PTR [ebp-0x4],eax
   0x08048417 <+12>: mov    eax,DWORD PTR [ebp+0xc]
   0x0804841a <+15>: mov    DWORD PTR [ebp-0x8],eax
   0x0804841d <+18>: mov    edx,DWORD PTR [ebp-0x4]
   0x08048420 <+21>: mov    eax,DWORD PTR [ebp-0x8]
   0x08048423 <+24>: add    eax,edx
   0x08048425 <+26>: push   eax
   0x08048426 <+27>: push   DWORD PTR [ebp-0x8]
   0x08048429 <+30>: push   DWORD PTR [ebp-0x4]
   0x0804842c <+33>: push   0x80484f0
   0x08048431 <+38>: call   0x80482e0 <printf@plt>

////////////////////////////////////////////////////////////////////

[ 스택 에필로그 ]
   0x08048436 <+43>: add    esp,0x10
   0x08048439 <+46>: nop
   0x0804843a <+47>: leave  
   0x0804843b <+48>: ret    
End of assembler dump.



'어셈블리' 카테고리의 다른 글

인라인 어셈블리  (0) 2017.10.15
제곱 어셈블리  (0) 2017.10.13
배열 어셈블리  (0) 2017.09.28
인라인 어셈 함수 인자 전달  (0) 2017.09.27
어셈블리 문자열 복사 stos  (0) 2017.09.27

배열 어셈블리

어셈블리2017. 9. 28. 20:47

gdb-peda$ list

1 # include <stdio.h>

2

3 int main(void) {

4 int array[] = {10, 20 ,30, 40, 50};

5

6 return 0;

7 }

gdb-peda$ disassemble main

Dump of assembler code for function main:

////////////////////////////////////////////////////////////////////

[ 스택 프롤로그 ]

   0x080483db <+0>: push   ebp

   0x080483dc <+1>: mov    ebp,esp

   0x080483de <+3>: sub    esp,0x14

////////////////////////////////////////////////////////////////////

   0x080483e1 <+6>: mov    DWORD PTR [ebp-0x14],0xa

   0x080483e8 <+13>: mov    DWORD PTR [ebp-0x10],0x14

   0x080483ef <+20>: mov    DWORD PTR [ebp-0xc],0x1e

   0x080483f6 <+27>: mov    DWORD PTR [ebp-0x8],0x28

   0x080483fd <+34>: mov    DWORD PTR [ebp-0x4],0x32

////////////////////////////////////////////////////////////////////

[ 스택 에필로그 ]

   0x08048404 <+41>: mov    eax,0x0

   0x08048409 <+46>: leave  

   0x0804840a <+47>: ret   

//////////////////////////////////////////////////////////////////// 

End of assembler dump.



'어셈블리' 카테고리의 다른 글

제곱 어셈블리  (0) 2017.10.13
어셈블리 함수 공부 중  (0) 2017.09.28
인라인 어셈 함수 인자 전달  (0) 2017.09.27
어셈블리 문자열 복사 stos  (0) 2017.09.27
overflow 어셈블리  (0) 2017.09.27

# include <stdio.h>


void f(int param1, int param2) {

char* checkPrompt = "param1 => %d param2 => %d\n";

__asm {

mov eax, dword ptr ss : [ebp + 0x8];

mov ebx, dword ptr ss : [ebp + 0xc];

push eax;

push ebx;

push checkPrompt;

call dword ptr[printf];

pop ebx;

pop ebx;

pop ebx;

leave;

retn;

}

}

int main(void) {

__asm {

mov eax, 10;

mov ebx, 11;

push ebx;

push eax;

call dword ptr[f];

pop ebx;

pop ebx;

xor eax, eax;

leave;

retn;

}

}

'어셈블리' 카테고리의 다른 글

어셈블리 함수 공부 중  (0) 2017.09.28
배열 어셈블리  (0) 2017.09.28
어셈블리 문자열 복사 stos  (0) 2017.09.27
overflow 어셈블리  (0) 2017.09.27
어셈블리 크기 비교  (0) 2017.09.27

# include <stdio.h>


int main(void) {

char buf[100] = { 0, };

char* promptResult = "buf => %s\n";

__asm {

mov eax, 0x6c6c6568; // little endian

lea edi, dword ptr[buf];

stos dword ptr[edi];


mov eax, 0x6f77206f; // little endian

stos dword ptr[edi];


mov eax, 0x646c72; // little endian

stos dword ptr[edi];

//////////////////////////////////////////

lea edi, dword ptr[buf];

push edi;

push promptResult;

call dword ptr[printf];

pop ebx;

pop ebx;


xor eax, eax;

leave;

retn;

}

}

'어셈블리' 카테고리의 다른 글

배열 어셈블리  (0) 2017.09.28
인라인 어셈 함수 인자 전달  (0) 2017.09.27
overflow 어셈블리  (0) 2017.09.27
어셈블리 크기 비교  (0) 2017.09.27
어셈블리 div  (0) 2017.09.26

# include <stdio.h>


int main(void) {

char v = 127;

char* prompt = "overflow \n";

char* prompt_1 = "not overflow \n";

__asm {

add v, 0x1;

jo s;

jno sn;

s:

push prompt;

call dword ptr[printf];

pop ebx;

jmp TheEnd;

sn:

push prompt_1;

call dword ptr[printf];

pop ebx;

jmp TheEnd;


TheEnd:

xor eax, eax;

leave;

retn;

}

}

'어셈블리' 카테고리의 다른 글

인라인 어셈 함수 인자 전달  (0) 2017.09.27
어셈블리 문자열 복사 stos  (0) 2017.09.27
어셈블리 크기 비교  (0) 2017.09.27
어셈블리 div  (0) 2017.09.26
어셈블리 최소값 추출  (0) 2017.09.26

# include <stdio.h>


int main(void) {

int v1 = 0; // initiallize

int v2 = 0; // initiallize

char* prompt = "%d %d";

char* s1 = " > \n";

char* s2 = " < \n";

char* s3 = " == \n";


__asm {

lea eax, v1; // eax = &v1

lea ebx, v2; // ebx = &v2


push ebx;

push eax;

push prompt;

call dword ptr[scanf];

pop ebx;

pop ebx;

pop ebx;


mov eax, v1;

mov ebx, v2;

cmp eax, ebx;

je sameJump;

jne notSameJump;

sameJump:

push s3;

call dword ptr[printf];

pop ebx;

jmp TheEnd;

notSameJump:

ja aboveJmp; // v1 > v2

jna belowJmp; // v1 > v2

aboveJmp:

push s1;

call dword ptr[printf];

pop ebx;

jmp TheEnd;

belowJmp:

push s2;

call dword ptr[printf];

pop ebx;

jmp TheEnd;

TheEnd:

xor eax, eax;

leave;

retn;

}

}

'어셈블리' 카테고리의 다른 글

어셈블리 문자열 복사 stos  (0) 2017.09.27
overflow 어셈블리  (0) 2017.09.27
어셈블리 div  (0) 2017.09.26
어셈블리 최소값 추출  (0) 2017.09.26
어셈블리 배열 출력  (0) 2017.09.26

어셈블리 div

어셈블리2017. 9. 26. 16:07

# include <stdio.h>


int main(void) {

int v1 = 243;

int v2 = 5;

int v3 = 0;

int v4 = 0;

__asm {

xor edx, edx; // mov edx, 0x0 

mov eax, v1;

mov ebx, v2;

div ebx; 

mov v3, edx; // remainder => edx

mov v4, eax; // queotiont => eax

}

printf("%d %d\n", v3, v4);

return 0;

}

'어셈블리' 카테고리의 다른 글

overflow 어셈블리  (0) 2017.09.27
어셈블리 크기 비교  (0) 2017.09.27
어셈블리 최소값 추출  (0) 2017.09.26
어셈블리 배열 출력  (0) 2017.09.26
곱하기 어셈 문제  (0) 2017.09.24