어셈블리어 코드 질문있습니다

qoqkwl6593의 이미지

int main()
{
        char *str[2];
        str[0] = "/bin/sh";
        str[1] = 0;
        execve(str[0], str, 0);
}

위 c언어 코드를 어셈 코드로 변경한 것입니다.
.globl main
main:
        jmp come_here
func:
        movl $0x0b, %eax
        popl %ebx
        movl %ebx, (%esi)
        movl $0x00, 0x4(%esi)
        leal (%esi), %ecx
        movl $0x00, %edx
        int $0x80
        movl $0x01, %eax
        movl $0x00, %ebx
        int $0x80
come_here:
        call func
        .string "/bin/sh\00"

main:
jmp come_here
func:
movl $0x0b, %eax // execve의 시스템 콜번호 11을 %eax에 넣음
popl %ebx // "/bin/sh"의 주소를 %ebx에 넣음(첫째인자)
movl %ebx, (%esi)
movl $0x00, 0x4(%esi) // 배열 포이터를 구현.["/bin/sh"의 주소][0]
leal (%esi), %ecx // 배열 포이터 시작 주소를 %ecx에 넣음(둘째인자)
movl $0x00, %edx // NULL을 넣음.(셋째 인자)
int $0x80 //시스템 콜 호출 인터럽트 발생
movl $0x01, %eax //여기서부터 exit(0)을 구현
movl $0x00, %ebx
int $0x80

이렇게 되어있는것을 그대로 작성해보았습니다.
제 리눅스가 세그먼트폴 오류를 자꾸발생시켜서.
Error
Segmentation fault (core dumped)

이유좀 알려주시면 감사하겠습니다.

라스코니의 이미지

int main()
{
char *str[2];
str[0] = "/bin/sh"; // str[0] 는 char * 형인데 영역이 할당되어 있지 않습니다. 세그먼트 폴트를 일으킬 겁니다.
// str[0] = malloc(100); 등으로 초기화 필요
str[1] = 0; // str[1] = NULL 과 같습니다. 문제없음
execve(str[0], str, 0);
}

익명 사용자의 이미지

str[0] 포인터에 전역(.data) 읽기전용 문자열 "/bin/sh" 의 주소를 할당하는
"정상적인" 연산인데 세그먼테이션 폴트가 뜰 이유가 전혀 없습니다.

익명 사용자의 이미지

그대로 작성하셨다는 것을 어떻게 작성하셨는지 내용을 보여주시고 컴파일을 어떻게 하셨는지 좀 더 구체적으로 글을 써주세요.

indra의 이미지

작성하신 원본 소스코드의 테스트를 위해 gcc의 -g 옵션(디버깅 옵션)을 포함하여 컴파일 한 후 core 파일을 생성하기 위해 ulimit 명령어를 사용하여 테스트 환경을 만듭니다.

[indra@CentOS5 shell]$ cat > 1.s
.globl main
main:
        jmp come_here
func:
        movl $0x0b, %eax
        popl %ebx
        movl %ebx, (%esi)
        movl $0x00, 0x4(%esi)
        leal (%esi), %ecx
        movl $0x00, %edx
        int $0x80
        movl $0x01, %eax
        movl $0x00, %ebx
        int $0x80
come_here:
        call func
        .string "/bin/sh\00"
[indra@CentOS5 shell]$ cc -o 1 1.s -g <- 컴파일
[indra@CentOS5 shell]$ ulimit -c unlimited <- core 파일 생성을 위한 환경 설정
[indra@CentOS5 shell]$ ./1
Segmentation fault (core dumped) <-- core 파일 생성
[indra@CentOS5 shell]$

segfault의 원인 파악

[indra@CentOS5 shell]$ gdb ./1 --core=core.9223
GNU gdb (GDB) CentOS (7.0.1-42.el5.centos)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/indra/Project/hackedteam/hackedteam/shell/1...done.
[New Thread 9223]
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/ld-linux.so.2
Core was generated by `./1'.
Program terminated with signal 11, Segmentation fault.
#0  func () at 1.s:7
7               movl %ebx, (%esi) <- segfault 문제의 원인
(gdb) i r $esi
esi            0x398ca0 3771552
(gdb) x/8x *$esi
0x0:    Cannot access memory at address 0x0
(gdb) x/8x $esi
 
0x398ca0 <_rtld_local_ro>:      *0x00000000*      0x00020612      0xbfa5c63b     0x00000004
0x398cb0 <_rtld_local_ro+16>:   0x00001000      0x001102b8      0x00000003     0x00000064
(gdb) q

gdb로 확인 결과 %ebx를 %esi의 상대주소에 복사하려 하지만 %esi의 상대주소는 0x00000000 이므로 segfault를 일으킵니다.
%esi를 사용하지 않고 stack에 "/bin/sh"의 주소를 저장했다가 뽑아오는 방식으로 변경하려 합니다.
[indra@CentOS5 shell]$ cp 1.s 2.s
[indra@CentOS5 shell]$ vi 2.s <- 본래의 소스코드를 기준으로 일부 로직을 변경합니다
[indra@CentOS5 shell]$ cc -o 2 2.s -g
[indra@CentOS5 shell]$ strace -f -o debug ./2  <-- execve()의 실행 환경을 보기 위해 strace를 사용하여 로그를 남깁니다.
sh-3.2$ ps  <-- "/bin/sh" 정상실행
  PID TTY          TIME CMD
  588 pts/1    00:00:00 bash
 9340 pts/1    00:00:00 strace
 9341 pts/1    00:00:00 sh
 9342 pts/1    00:00:00 ps
sh-3.2$ exit
exit
[indra@CentOS5 shell]$ grep "/bin\/sh" debug <- strace의 로그 확인
9341  execve("/bin/sh", ["/bin/sh"], [/* 0 vars */]) = 0
[indra@CentOS5 shell]$ diff -uNr 1.s 2.s
--- 1.s 2015-07-04 08:27:00.000000000 +0900
+++ 2.s 2015-07-04 08:31:19.000000000 +0900
@@ -4,9 +4,9 @@
 func:
         movl $0x0b, %eax
         popl %ebx
-        movl %ebx, (%esi)
-        movl $0x00, 0x4(%esi)
-        leal (%esi), %ecx
+       push $0x00
+       push %ebx
+        movl %esp, %ecx
         movl $0x00, %edx
         int $0x80
         movl $0x01, %eax
[indra@CentOS5 shell]$

변경된 부분에 대해서는 %esi 레지스터를 사용하여 execve()의 2번째 인자를 만들지 않고 stack을 사용하여 "/bin/sh"의 주소를 push 했다가 esp를 사용하여 해당 주소를 얻어오는 방식으로 변경해 보았습니다.
테스트 한 머신은 CentOS 5.3 + gcc 4.1.2 + 커널버전 2.6.18-128.el5 입니다.

아래는 변경된 소스코드입니다.

참조 바랍니다.

.globl main
main:
        jmp come_here
func:
        movl $0x0b, %eax
        popl %ebx
        push $0x00
        push %ebx
        movl %esp, %ecx
        movl $0x00, %edx
        int $0x80
        movl $0x01, %eax
        movl $0x00, %ebx
        int $0x80
come_here:
        call func
        .string "/bin/sh\00"

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.