Post

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 LINESunset env COLUMNS를 해준 후 확인한 ret 주소를 이용하면 실제 바이너리에서도 동일하게 동작하게 됨.






쉘코드 모음


shellcode
shell-storm.org/shellcode/index.html






This post is licensed under CC BY 4.0 by the author.