Post

.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
29
.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
32
.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
21
...
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.