Buffer Overflow 몰랐던 내용
x86, x64 메모리 주소 체계 (BOF)
- 32/64비트 메모리 주소 체계
- hackstoryadmin.tistory.com/78?category=276534
스택과 레지스터를 32비트는 4바이트씩 구분하고, 64비트는 8바이트씩 구분을 한다.
여기서 중요한점은 64비트에서는 8바이트로 구분은 하지만 앞의 2바이트는 사용하지 않는다고 함.
즉, 실질적으로 6바이트만 사용하고 앞의 2바이트는 0x0000이 되는 것.
- BOF할 때, 64비트 프로그램에 대해서는 주의해야 함.
- hackstoryadmin.tistory.com/entry/x64-BOFBuffer-Overflow
쉘코드 삽입 시 파이썬 버전에 따른 차이
쉘코드를 삽입을 했는데 hex 값이 변하는 경우가 있음.
- 이 경우는 python3의 변환방식 때문에 발생하는 문제임.
- security.stackexchange.com/questions/270884/bufferoverflow-chars-gets-replaced-on-stack
예를 들어, \x90
을 python3을 이용해 전달한다면 이 값이 \xc2
로 변하였음.
또는 \xff
가 \xbf\xc3
으로 변하기도 함.
1
2
3
4
r `python3 -c 'print("\x90"*88+"AABBCC")'`
gdb-peda$ x/gx $rbp-0x50
0x7fffffffe310: 0x90c290c290c290c2
1
2
3
4
r `python3 -c 'print("\xff"*88+"AABBCC")'`
gdb-peda$ x/gx $rbp-0x50
0x7fffffffe310: 0xbfc3bfc3bfc3bfc3
그래서 웬만하면 파이썬2로 하면 좋겠지만 없다면 perl을 이용해서 하던가, python3 뿐이라면 이 방법은 나중에 찾아보기
gdb와 실제 바이너리 차이
- gdb에서는 내가 작성한 payload가 잘 작동해서 쉘이 흭득되는데, 바이너리에서는 segmentation fault가 뜨는 경우
- reverseengineering.stackexchange.com/questions/16677/why-does-my-shellcode-work-in-gdb-but-not-on-the-command-line
리눅스 환경변수에 터미널 사이즈와 관련된 변수인 $LINES
와 $COLUMNS
가 있음.
이 두 값이 gdb 실행 시 영향을 주나봄. 그래서 메모리 주소들에 영향을 줘서 gdb에서 먹힌 ret 주소가 실제 바이너리에서는 안되는 것임.
그래서 gdb 실행 후 unset env LINES
와 unset env COLUMNS
를 해준 후 확인한 ret 주소를 이용하면 실제 바이너리에서도 동일하게 동작하게 됨.
쉘코드 모음
- shellcode
- shell-storm.org/shellcode/index.html
This post is licensed under CC BY 4.0 by the author.