pwn college에서 fsb 문제들로 배운 점들을 정리한다.
(fsb는 너무 어렵다..)
64비트를 기준으로 출력되는 순서는 다음과 같다.
rsi, rdx, rcx, r8, r9, [rsp], [rsp+8], [rsp+0x10], [rsp+0x18], [rsp+0x20] ...
rsp+0부터 쭉쭉 가다보면 buffer 주소가 나올 것이다.
웬만하면 fsb가 터지는 출력 함수가 호출되기 직전에 브포를 걸고 하는 게 좋다. (레지스터 값을 보기 위해)
다음은 메모리의 값을 읽는데 사용되는 형식 지정자들이다. (AAR)
%c, %hhx: 1 byte
%hx: 2 bytes
%d, %i, %x: 4 bytes
%lx, %p: 8 bytes
%s: dereference a pointer
'%' 문자와 '$' 문자를 같이 사용하면 n번째 파라미터를 바로 가리킬 수 있다.
%[n]$p
다음은 메모리에 값을 쓰는데 사용되는 형식 지정자들이다. (AAW)
%hhn: 1 byte
%hn: 2 bytes
%n: 4 bytes
%ln: 8 bytes
이 부분이 좀 신기했는데 메모리 복사를 할 수도 있다.
아래 예시는 10번째 인자 위치에 저장된 값을 참조해서 11번째 인자로 복사한다.
다만 %c(1 byte) 단위로 복사하기 때문에 너무 큰 값을 복사해오긴 어렵다.
헷갈리면 안되는게 *가 붙었다고 해서 %s처럼 dereference를 하는 건 아니다. (n이 가리키는 11번째 인자는 당연히 포인터)
fsb를 수행할 때, pwntools의 fmtstr_payload가 유용하다.
offset에는 rsi에서 buffer까지의 오프셋을 인덱스 형식의 값을 적는다. (buffer: 입력 값이 들어가는 곳)
addr에는 값을 쓰고자 하는 타겟 주소, value에는 쓰고자 하는 값을 적는다.
numbwritten에는 출력 함수로 이미 출력된 문자 바이트들의 수를 적는다.
write_size에는 값을 쓰는 단위를 적는다. byte, short, int 중 어떤 걸 사용할지 적으면 된다.
context.arch = 'amd64' # if arch is 64bit
fmtstr_payload([offset], {[addr]:[value]}, numbwritten=[written_bytes], write_size=['byte'|'short'|'int'])
rsp의 주소를 알 때 이런 것도 가능하다.
fsb 취약점이 발생하는 출력 함수가 호출될 때, 즉 call 명령이 수행되면 리턴 주소가 push되어 rsp는 -8이 되고 해당 위치에는 리턴해서 돌아갈 주소가 저장된다.
fsb 페이로드를 이용해 이 주소를 변조하면 함수가 리턴할 때 컨트롤 하이제킹이 가능하다.
다만, 가젯의 주소 등을 직접 가리키도록 해야 한다. 여기서 가젯의 주소는 opcode가 저장된 주소를 의미한다.
'$' 문자를 사용할 수 없는 경우엔 메모리에 값을 쓰고 해당 값을 읽도록 만들어줘야한다. 맥락은 위 내용과 동일하다.
32비트와 달리, 64비트의 경우 상위 2바이트가 비어 있어서 0x00이기 때문에 주소 부분을 뒤로 배치해줘야 한다.
('$'문자 들어간 fsb에서도 그렇게 했었다, null은 문자열의 끝이기 때문)
결론은 충분한 공간만 주어지면 '$' 문자 없이도 순서대로 읽어나가면서 도달할 수 있다는 것이다.
메모리에 값을 쓸 땐 이미 출력된 문자열의 길이를 고려해줘야 한다.
필요 시 integer overflow를 이용한다.
https://pwn.college/software-exploitation/format-string-exploits/
https://softsec.kaist.ac.kr/depot/sangkilc/cs492e/11-format.pdf
'background > linux' 카테고리의 다른 글
[pwn.college] Return Oriented Programming (1) | 2024.05.02 |
---|---|
FSOP(File Stream Oriented Programming) (0) | 2024.04.29 |
[how2heap] Tcache Poisoning (glibc 2.31/2.35) (0) | 2024.04.10 |
[how2heap] House of Botcake (glibc 2.31) (0) | 2024.03.18 |
[how2heap] Fastbin dup into stack (glibc 2.35) (1) | 2024.03.11 |