<LOB gremlin->cobolt>
전에 우연히 알게된 방법인데 win을 누르면 login창으로 갈 수 있다.
지난 gremlin.c와의 차이는 buffer의 크기가 훨씬 작다는 것이다.
1. ret 전 채워야 할 dummy 구하기
strcpy() 함수가 리턴되고 add명령어가 실행되기 전까지의 크기를 구해야 하므로 add 명령어 부분에 breakpoint를 잡자.
인자로 “”A””*16의 dummy를 넣어서 buffer를 채운 후 주소를 출력해보면 0xbffffb78은 sfp이고, 0x400309cb가 ret 주소이다.
그러면 buffer(16) + sfp(4) + ret(4) 구조이므로 ret 전까지, 즉 20의 dummy를 넣으면 된다.
2. system() 함수의 실행 후 시작주소 구하기
간단한 system() 함수가 있는 c프로그램을 작성한다.
저 주소는 system() 함수의 호출 지점이고, 실행시점에 공유 라이브러리를 로딩한 후 system() 함수의 시작점을 찾아야 한다.
실행 후 system() 함수의 시작주소는 0x40058ae0이다.
3. “”/bin/sh”” 위치 찾기
memcmp() 함수를 사용하는 것이 “”/bin/sh””의 주소를 찾을 가장 간단명료한 방법이었기 때문에 이번에도 memcmp()함수를 사용한다.
shell의 초기값은 system() 함수의 실행 시 시작주소이다.
shell++로 주소를 증가시키면서 shell과 “”/bin/sh””의 주소를 비교해서 “”/bin/sh””가 위치한 주소를 찾는다.
찾으면 while문을 나와 shell의 주소를 출력한다.
“”/bin/sh””의 주소는 0x400fbff9이다.
4. payload 작성
RTL 기법 이용
buffer(16) + sfp(4) + system() addr(0x40058ae0) + dummy(원래는 다음 실행할 명령주소) + “”/bin/sh”” addr(0x400fbff9)
1번에 의해 buffer(16) + sfp(4)도 dummy로 채운다.
이때 주소의 경우 little endian 방식으로 작성해야 하므로,
system() addr: \xe0\x8a\x05\x40
“”/bin/sh”” addr: \xf9\xbf\x0f\x40
다음 레벨의 패스워드를 획득했다.
[LOB] level10: vampire -> skeleton (0) | 2019.05.01 |
---|---|
[LOB] level8: orge->troll (0) | 2019.04.28 |
[LOB] level3: cobolt -> goblin (0) | 2019.04.01 |
BOF(Buffer Overflow) 공격-고전적인 방법 (0) | 2019.03.29 |
[LOB] gate -> gremlin (0) | 2019.03.28 |