ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 어셈블리 프로그래밍
    Hack/Pwnable 2015. 10. 5. 14:01

    여기서는 int 0x80을 이용하여,syscall number를 이용하여 출력을 시키는것을 해볼것이다.


    write함수를 이용해서 출력을할건데, syscall number를 검색해보면 write함수는 시스콜넘버가 4번인것을 알수있다.


    기본적으로 eax레지스터에 시스콜넘버가 들어가기때문에 eax에는 4가 들어가고, 그다음부터 ebx,ecx,edx... 다음 인자들을 하나하나 넣어주면된다.

    어셈블리는 아래와같다.


    .globl main

    main:

    mov $4, %eax

    mov $1, %ebx

    mov $helloworld, %ecx

    mov $13, %edx

    int $0x80


    helloworld: .string "Hello World\n"


    string은 아래서 helloworld란이름으로 선언해두고, 

    eax에 4번을넣게되면서 write임을 알리고 인자를 각각넣어준후에 int $0x80을통해 호출을한다.


    root@HackCat:~/study/1# ./asm1

    Hello World

    Segmentation fault (core dumped)


    실행을하면 정상적으로Hello World가 출력이된다.


    근데 Segmentation fault가 뜨는데, 이는 간단하다.


    gdb로 분석을해보자


    (gdb) disas main

    Dump of assembler code for function main:

       0x080483ed <+0>: mov    $0x4,%eax

       0x080483f2 <+5>: mov    $0x1,%ebx

       0x080483f7 <+10>: mov    $0x8048403,%ecx

       0x080483fc <+15>: mov    $0xd,%edx

       0x08048401 <+20>: int    $0x80


    확실히 어셈으로 코딩을하니까 짧게 나오기는한다.


    (gdb) x/s 0x8048403

    0x8048403 <helloworld>: "Hello World\n"


    ecx, 두번째인자에 "Hello World\n"가 들어간다.


    최종적으로

    write(1,"Hello World\n",13); 이 실행되는것이다.


    일단앞에 fd를 보면,


    0과 1,2가 존재한다.


    0은 stdin, 1은 stdout, 2는 stderr이다.


    우리는 출력을맡으니까 stdout을 사용하기에 1을 넣어주었다.


    계속해서 분석을해보자


    (gdb) x/i $eip

    => 0x8048404 <helloworld+1>: gs

    (gdb) ni


    Program received signal SIGSEGV, Segmentation fault.


    실행을하다보면 gs라는 명령에서 터지는것을 알수있다.


    스택정리가안된상태에서 비정상적인 eip로 돌아가기때문에 세그먼트폴트가나는데, 스택프레임을 넣어주면간단하다.


    .globl main

    main:

            push %ebp

            mov %esp, %ebp

            mov $4, %eax

            mov $1, %ebx

            mov $helloworld, %ecx

            mov $13, %edx

            int $0x80

            leave

            ret


    helloworld: .string "Hello World\n"


    실행을해보자


    root@HackCat:~/study/1# ./asm1

    Hello World

    root@HackCat:~/study/1# 


    세그먼트폴트없이 정상적으로 실행된다



    'Hack > Pwnable' 카테고리의 다른 글

    Improper Null Termination (SSP)  (0) 2015.11.20
    puts 어셈블리 프로그래밍  (0) 2015.10.06
    SSP Leak Prob  (0) 2015.09.30
    RTL Chaining 문서  (0) 2015.09.27
    RTL(Return To Libc)  (0) 2015.09.27

    댓글

Designed by Tistory.