
LOB
[the Lord Of Buffer overflow]
#16 : assassin->zombie_assassin
오늘은 풀이 안보고 풀어보려 했는데,, 메모리 주소와 그 값을 헷갈려서 Fake EBP에 대한 개념을 제대로 잡지 못했다.
그래서 결국 풀이를 봐도 이해가 안되서 ,, LOB 이 문제 풀이만 10개는 읽어본 것 같다.
그 중에 가장 이해가 잘 되었던 풀이를 참고란에 올렸다.
다들 쉘코드의 주소-4 를 Fake EBP로 한다고 하는데, 그 의미는
FEBP 주소 다음 4바이트에는 쉘코드의 주소가 메모리 값에 들어가야 한다는 것이었다!
이번엔 풀이를 좀 자세히 써보도록 하자.
일단 소스코드에 memset이 없으므로 버퍼에 쉘코드를 올릴 수 있었다.
근데 이제 라이브러리 영역을 RET으로 쓸 수 없었고, strncpy이므로, RET SLED도 불가능 했던 것..

일단 버퍼의 크기는 40바이트 이고, leave의 가젯은 0x080484df였다.

(하도 해서 외워버림..)

일단 temp로 카피해서 gdb로 아무거나 넣어서 r 해보았다.

인자가 딱 들어가는 부분이 0xbffffc20이길래, 40바이트의 버퍼에서 쉘코드 25바이트를 빼면 15바이트가 남는데, 그 중에 4바이트는 쉘코드의 주소를 써야하므로, 11바이트를 NOP으로 채울 수 있었다.
그래서 맨 처음에 쉘코드의 주소(대충 NOP이 있을 것 같은 부분을 넣으면 됨)를 쓰고, NOP을 채우고, 쉘코드를 쓰고 SFP로 Fake EBP를 주어야 했다. Fake EBP로는 쉘코드의 주소가 들어가는 부분의 -4부분을 해야 하므로(그래야 pop ebp를 했을 때 +4가 되어서 esp가 0xbffffc20을 가르킬 것이고, 거기서 pop eip하면 0xbffffc20에 있는 쉘코드의 주소가 eip에 저장될 것이기 때문), 0xbffffc20에 우리가 쉘코드의 주소를 넣었으니까, 0xbffffc1c를 넣어보았다.

근데 왠지 안됨..
(다들 이렇더라? 한 10개 정도의 풀이를 봤는데, 다들 코어 덤프 뜨고 있었음. 아마 인자의 길이 때문에 틀어지는 것 같다.)
그래서 나도 덤프 떴다. 내가 준 인자의 시작부분이 0xbffffc22가 됨을 알 수 있었다. 맨 마지막 명령어는 잘못 친거임.

인자 시작 부분에 4를 더한 값을 처음에 줘야 했으므로(앞에서 설명함), 26이 될 것이고, SFP는 인자시작부분 -4가 되어야 하므로 1e가 된다. 그래야 ebp와 esp가 0xbffffc1e가 되었다가, pop ebp되면 ebp는 어디론가 갈거고(상관없음), esp는 +4되어(pop되었으니까) 0xbffffc22를 가르킬 것이다. 0xbffffc22 안에는 0xbffffc26이라는 값이 들어있으므로, 어셈블리 명령어 ret에 의해 0xbffffc26의 메모리 주소에 있는 쉘코드를 실행한다.
쉘이 떴으니 원본파일에도 했는데,,,,안된다...

잘 모르겠지만, 아마 argv[0]의 길이가 달라서 그런 것 같다..그냥 링크 걸어서 풀었다.

그리고 나서는 다른 방법으로 혼자 풀어봐야 겠다고 생각해서 argv[1]의 길의 제한은 없길래 그냥 쉘코드를 뒤에 삽입해서 풀어보았다. 인자의 처음 부분과 SFP를 아무거나 넣고 덤프 떴는데,

메모리가 이런 형태였다. 쉘코드의 시작은 0xbffffb71이었으니 인자 처음 부분에 써주고, SFP로는 이 써준 부분의 주소값 0xbffffb41에 -4를 한 0xbffffb3d를 넣었다.

성공.
정말 사람은 하다보면 느는 것 같다.
오늘 하루종일 FEBP만 하니까 조금은 알 것 같다. 환경변수로도 한 번 풀어봐야 겠다.
참고 :
'Wargame > LOB(Redhat)' 카테고리의 다른 글
[LOB] succubus->nightmare (0) | 2019.07.03 |
---|---|
[LOB] zombie_assassin->succubus (0) | 2019.07.01 |
[LOB] gaint->assassin (0) | 2019.03.31 |
[LOB] bugbear->giant (0) | 2019.03.29 |
[LOB] darkknight->bugbear (0) | 2019.03.28 |