대학생들을 위한 IT

쉘코드3-1 :: 이커시 (Trampoline) 본문

악성코드

쉘코드3-1 :: 이커시 (Trampoline)

phantomik 2019. 1. 18. 02:20

지난 포스팅에서는 랜덤으로 바뀌는 복귀 주소 값때문에 원하는 주소로 보내지 못하는 상황에 놓여버렸다.

이번 시간에는 '그 상황'을 벗어나보려 한다. 자 가보자!


먼저 저번 시간에 했던 상황을 다시 생각보자

스택 그림

스택 그림에서의 목표는 [0012FF80] 주소에 저장된 [0012FF84] 주소 값을 읽어 와서 [0012FF84] 주소를 찾아 그곳에 저장된 쉘코드를 실행하게 만드는 작업이다.

하지만 항상 같은 스택 공간에 데이터가 쌓이는 것이 아니기 때문에 고정적인 주소를 가지는 무언가를 찾아야 했다.

필자는 JMP, CALL, RETN 등 여러가지가 있겠지만서도 JMP를 선별하고, 이를 ESP 기준으로 삼았다. 

JMP ESP 메모리 주소 찾기

찾음

마우스 우측 클릭 후 [Search for] 탭에서 --> [All Commands in all modules] 을 찾아 누른 후 'JMP ESP'를 치면 JMP ESP로 사용하는 여러 주소들이 나온다 그 중에서 가장 위에 있는 '0043C8D1'주소를 찾아 쓸 것이다.

펄 소스 수정

어제 작성 했던 펄 소스에서 [my $ret] 값을 [0043C8D1]으로 수정하자! (16진수 이기 때문에 '\x' 빼먹지 말자) 

트렘펄린 확인

[4141414C] 부분을 읽다가 죽었다는 메시지를 남겼지만 Disassenbly 창을 보니 [calc.]을(쉘코드부분) 읽기 전이다! 이로 인해 [JMP ESP] 작전이 먹혔다는 사실은 알 수 있다. 

엄밀히 말하면 [JMP]가 먹혔지 [ESP]은 먹히지 않은 상황! 저번 시간엔 [EBP]기준으로 기계어를 작성했기 때문에, 이를 다시 [ESP]기준으로 수정해야 한다.

ESP기준 기계어 코드

디버깅 후 바이너리 카피

수정한 기계어 코드 바탕으로 쉘코드를 다시 만들어야 하기 때문에, 디버깅 후 바이너리 카피하는 모습이다. 

항상 메모장에 복붙해서 필요 없는 부분을 일일이 지웠는데 얼마 전에 바이너리 부분만 카피할 수 있다는 걸 알게 되었다. 개꿀

디버깅 중 다시 죽음

실행코드는 실행되었지만서도 [PUSH 5]=보여주기 부분에서 죽어버렸다. 

[0012F8BA] <-->[0012F8BC] 코드 내용을 바꾸어 줬더니 해결이 되었다. 

수정 후

최종 쉘코드 등장

나왔다 드디어 최종 쉘코드가!!

이는 [fuzz12.wav] 파일을 만들어줄 것이고, 

이 .wav파일은 [All to Mp3 Converter] 프로그램에 변환되기 위하는 과정에서 '계산기'를 뿌릴 것이다.

실행된 모습

실제 프로그램에서 [fuzz12.wav]파일을 열었을 때에도 계산기가 실행된다.

이렇게 최종 쉘코드까지 만들어보았다. 다음 시간에는 저 [.wav] 파일을 [All to mp3 Converter]에서 열었을 때,
간단한 프로그램을 다운받고 이를 실행시키는 쉘코드까지 만들어보겠다.

'악성코드' 카테고리의 다른 글

쉘코드4-1 :: 이커시  (1) 2019.01.20
쉘코드4 :: 이커시  (0) 2019.01.20
쉘코드3 :: 이커시  (0) 2019.01.17
쉘코드2 :: 이커시  (1) 2019.01.16
쉘코드 :: 이커시  (0) 2019.01.15
Comments