[어설픈] LOB 7번 darkelf 문제풀이

2019. 3. 21. 19:05System Hacking/[LOB] Hacker School

안녕하세요!

오늘은 LOB 7번째 문제인 

darkelf 문제풀이를 해보도록 하겠습니다!


아래에 소스코드가 있는데요!

직전 문제 wolfman과 달라진 점이 

한 군데 있네요!


//here is changed! 부분의 코드를 보면

argv[1]이 아니라 

argv[0]의 길이가 무조건 77이 돼야 하네요..

그게 아니면 argv[0] 에러라는 메세지를 출력하잖아요!


나머지 소소코드에 대한 해석은 woflman에서도 했으나,

간단하게만 다시 요약하자면

(자세한 소스코드 풀이는 전에 문제들을 참고해 주세요! :) )


argument 갯수 2개 이상


환경변수 사용 못함!


argv[1]의 48번째 값 \xbf!


argv[1]의 길이 48까지 가능


버퍼 공간 0으로 메모리 초기화!


그리고 이번에 추가된 argv[0]의 길이 77로 세팅!

직전 문제와 다른건 다 같게하고 argv[0]의 길이만 같게하면 풀리겠네요 :)



근데 여기서 저희가 생각해야 할 것은!

argv[0]이 무엇인가!

argv[0] == 일반적으로 파일의 이름인데...


그럼 파일의 이름을 77개의 문자로 바꿔야 하는건가?

이런 생각이 들었습니다!


그래서 일단 아래와 같이 tmp 폴더를 만들고

거기에 orge 파일을 복사하고!


orge 파일에 symbolic link를 걸었습니다!

(symbolic link = 프로그램의 바로가기로 이해)

ln -s [원래 프로그램 이름] [symbolic link 이름]


근데 저희가 파일을 실행할때 앞에 ./ 를 붙이니

77글자에서 2글자를 뺀

75개의 a로 만들어 줘야합니다!


argv[0]

./(2글자) + aaaaaaa.....(75글자) = 77 글자


그리고 tmp폴더가 아닌

  원래 폴더에 돌아가서도 

 symbolic link를 걸었습니다!



그리고 바로 tmp 폴더로 돌아가서

gdb로 심볼릭링크가 들어간 파일을!

실행했습니다!

그러면 symbolic link가 argv[0]에 들어가겠죠?


직전 문제와 똑같이 저희는 

main함수로 들어가기 직전에 breakpoint를 겁니다!

(== main에 breakpoint!)




아래처럼 잘 걸어주고! 

저희는 이제 argv[1]에 

직전 문제와 같이

 

\x90(NOP)를 19개 주고 

쉘코드 25byte쓰고

ret_address 4byte씁니다!


그러면 딱 48byte가 되겠죠?

그 상태에서 run을 합니다!



그리고 바로 break가 걸리는데요!

여기서 argc값 0x00000002 뒤에 있는

0xbffffa84가 argv의 주소들을 갖고 있습니다!



그래서 바로 아래와 같이 

x/2x 0xbffffa84를 입력하면

첫 번째에는 argv[0] 주소! 두 번째에는 argv[1] 주소!


그리고 string으로 그 주소에 뭐가 들어가 있는지 확인해보면!

아래처럼 저희가 입력한 \x90과 shellcode가 들어가 있죠?


저희가 argv[0]의 길이만 77로 딱! 맞춰주고

나머지 조건들은 직전 wolfman과 같으니

직전 문제와 똑같이 argv[1] 주소로 return 하면

되겠죠?




그래서 바로 아래와 같이 payload를 완성해 보았습니다!

argv[0] 길이 맞췄죠?

그리고 바로 뒤에는 nop(\x90) 19개와 shellcode 25byte 그리고 argv[1]의 주소

이렇게 입력값을 주었는데 segmenatation fault가 뜨네요!



이번에는 그래서

core 파일을 열어보았습니다!

(segmentation fault가 뜨면 코어파일이 생겨요 :) )


그래서 스택상황을 esp로 확인을 해보니!

맨 밑에 저희가 입력한 쉘코드의 시작점이 보이네요!

0xbffffb90에서 오른쪽으로 이동하시다 보면 

0x31부분이 보이실꺼에요!


실제로 프로그램에는 0xbffffb97 부분이네요!



그래서 ret_address만 0xbffffb97로 바꾸면!

아래와 같이 쉘이 따집니다!


그리고 비밀번호가 보이네요!

고생하셨습니다!