SECURITY/REVERSING

์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ ๋ถ„์„ 5 - example 5 :: ๋ฐ˜๋ณต๋ฌธ

\b\t 2020. 7. 15. 16:38

* ์ด ๊ฒŒ์‹œ๊ธ€์€ AT&T ๋ฌธ๋ฒ•์— ๋”ฐ๋ผ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

(AT&T ์™€ Intel ์ฐจ์ด ์ฐธ๊ณ -

2020.07.08 - [SECURITY/REVERSING] - REVERSING ์‹œ์ž‘ํ•˜๊ธฐ - ๊ธฐ์ดˆ ๊ฐœ๋… 4 :: ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด )

 

REVERSING ์‹œ์ž‘ํ•˜๊ธฐ - ๊ธฐ์ดˆ ๊ฐœ๋… 4 :: ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด

์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด : ์ž์—ฐ์–ด์™€ ๊ธฐ๊ณ„์–ด ์‚ฌ์ด๋กœ, CPU ์˜ ๋ช…๋ น์–ด๋“ค์„ ์˜์–ด์˜ ์•ฝ์ž์ธ ๊ธฐํ˜ธ๋กœ ํ‘œ๊ธฐํ•œ ๊ฒƒ์ด๋‹ค. ์ด ๊ธฐํ˜ธ๋“ค์€ CPU ์˜ ๋ช…๋ น์–ด(๊ธฐ๊ณ„์–ด) ์™€ ์ผ๋Œ€์ผ ๋Œ€์‘ํ•œ๋‹ค. ์ปดํ“จํ„ฐ ๊ตฌ์กฐ์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๊ณ„์–ด

iforint.tistory.com

 

.file	"example5.c"
.section	.rodata
.LC0:
.string	"number %d \n"
.LC1:
.string	"%d * %d = %d \n"
.text
.globl	main
.type	main, @function
main:
.LFB0:
.cfi_startproc
pushq	%rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq	%rsp, %rbp
.cfi_def_cfa_register 6
subq	$16, %rsp
movl	$0, -8(%rbp)
jmp	.L2
.L3:
movl	-8(%rbp), %eax
movl	%eax, %esi
movl	$.LC0, %edi
movl	$0, %eax
call	printf
addl	$1, -8(%rbp)
.L2:
cmpl	$9, -8(%rbp)
jle	.L3
movl	$0, -4(%rbp)
jmp	.L4
.L5:
movl	-8(%rbp), %eax
imull	-4(%rbp), %eax
movl	%eax, %ecx
movl	-4(%rbp), %edx
movl	-8(%rbp), %eax
movl	%eax, %esi
movl	$.LC1, %edi
movl	$0, %eax
call	printf
addl	$1, -4(%rbp)
.L4:
cmpl	$4, -4(%rbp)
jle	.L5
movl	$0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size	main, .-main
.ident	"GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4"
.section	.note.GNU-stack,"",@progbits

 

 

์ฒ˜์Œ์—” ๋‹นํ™ฉํ–ˆ์ง€๋งŒ, ์ด๋‚ด ๋ฐ˜๋ณต๋ฌธ ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค.

์กฐ๊ฑด๋ฌธ์ด ๋งค๊ฒจ์ง€๋Š” ์ˆœ์„œ๋Š” ์ฝ”๋“œ๊ฐ€ ์ง„ํ–‰๋˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋งค๊ฒจ์ง€๊ธฐ ๋•Œ๋ฌธ์—, L3 ๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜์ง€๋งŒ L2 ๊ฐ€ ๋จผ์ € ์ž‘์„ฑ๋˜์–ด์žˆ๋‹ค๋“  ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

JMP ๊ด€๊ณ„๋ฅผ ๋ณด์•„ํ•˜๋‹ˆ

L2 ์™€ L3 ๊ฐ€ ํ•˜๋‚˜์˜ ๋ฐ˜๋ณต๋ฌธ์„, L4 ์™€ L5 ๊ฐ€ ํ•˜๋‚˜์˜ ๋ฐ˜๋ณต๋ฌธ์„ ๊ตฌ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

jle : jump if less or equel, ์ฆ‰ <=

 

 

#include <stdio.h>

int main() {
    int a = 0, b;
    while (a != 10) {
        printf("number %d \n", a);
        a++;
    }
    for (b = 0; b <= 4; b++) {
        printf("%d * %d = %d \n", a, b, a * b);
    }
    return 0;

}

 

๋‘ ๋ฐ˜๋ณต๋ฌธ์„ ๊ฐ๊ฐ while ๊ณผ for ๋กœ ์ž‘์„ฑํ•˜์˜€๋Š”๋ฐ ์–ด์…ˆ๋ธ”๋Ÿฌ ์ฝ”๋“œ์—์„œ๋Š” ์ฐจ์ด๊ฐ€ ์—†์Œ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 

 

๋˜ํ•œ, L5 ์„ ์‚ดํŽด๋ณด๋ฉด, "%d * %d = %d \n" ์„ ์ถœ๋ ฅํ•˜๋ฏ€๋กœ printf ์— ํ•„์š”ํ•œ ์ธ์ž๊ฐ€ 4๊ฐœ์ด๋‹ค.

์ด๋“ค์„ ๋‹ค push ํ•˜๊ณ  printf ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ printf ํ•จ์ˆ˜๊ฐ€ ํ•˜๋‚˜์”ฉ pop ํ•ด์™€์„œ ์ธ์ž๋กœ ์“ด๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ง์ž‘ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

(์ฃผ์–ด์ง„ ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ ๋งค printf ๊ฐ€ ๋๋‚œ ํ›„์— eax ์— 0 ์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ printf ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์ธ๊ฐ€?)

 

๊ทธ๋ž˜์„œ push ๋Š” eax (a*b ์˜ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ) , -12(%ebp) (=a) , -16(%ebp) , LC1 ์ˆœ์„œ๋Œ€๋กœ ๋“ค์–ด๊ฐ€๊ณ , 

printf๋Š” "%d * %d = %d \n", a, b, a * b ์„ ์ธ์ž๋กœ ํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

๋ฐ˜๋ณต๋ฌธ์€ ์กฐ๊ฑด๋ฌธ๊ณผ ๋ถ„๊ธฐ๊ฐ€ ๋งŽ์•„์„œ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ถ„๊ธฐ์˜ ๋ฒˆํ˜ธ๋ฅผ ์œ ์˜ํ•ด์„œ ๋ฐฐ์น˜ํ•ด๋ณด๋ฉด ๋‹ต์„ ์–ป์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

 

์ด๋กœ์จ ์ผ๋‹จ๋ฝ์ด ๋๋‚ฌ๋Š”๋ฐ,

https://operatingsystems.tistory.com/entry/SP-Procedure-Call?category=495589

https://yunreka.tistory.com/6

์—ฌ๊ธฐ์—์„œ ํ—ท๊ฐˆ๋ฆฐ ๊ฐœ๋…๋“ค์„ ์žก์•˜์œผ๋‹ˆ ๋‹ค์‹œ ๋ณผ ๋•Œ ๋ชจ๋ฅด๊ฒ ์œผ๋ฉด ๋‹ค์‹œ ๋ณด๋„๋ก ํ•˜์ž.