ssongk
ssongk
ssongk
전체 방문자
오늘
어제

공지사항

  • resources
  • 분류 전체보기 (626)
    • CTF (24)
    • background (79)
      • fuzzing (5)
      • linux (29)
      • linux kernel (15)
      • windows (2)
      • web assembly (1)
      • embedded (0)
      • web (13)
      • crypto (9)
      • mobile (1)
      • AI (1)
      • etc.. (3)
    • write-up(pwn) (171)
      • dreamhack (102)
      • pwn.college (4)
      • pwnable.xyz (51)
      • pwnable.tw (3)
      • pwnable.kr (5)
      • G04T (6)
    • write-up(rev) (32)
      • dreamhack (24)
      • reversing.kr (8)
    • write-up(web) (195)
      • dreamhack (63)
      • LOS (40)
      • webhacking.kr (69)
      • websec.fr (3)
      • wargame.kr (6)
      • webgoat (1)
      • G04T (7)
      • suninatas (6)
    • write-up(crypto) (19)
      • dreamhack (16)
      • G04T (1)
      • suninatas (2)
    • write-up(forensic) (53)
      • dreamhack (5)
      • ctf-d (47)
      • suninatas (1)
    • write-up(misc) (13)
      • dreamhack (12)
      • suninatas (1)
    • development (31)
      • Linux (14)
      • Java (13)
      • Python (1)
      • C (2)
      • TroubleShooting (1)
    • 자격증 (8)
    • 이산수학 (1)
    • 정보보안 (0)
hELLO · Designed By 정상우.
ssongk

ssongk

[pwn.college] Format String Bug
background/linux

[pwn.college] Format String Bug

2024. 5. 6. 03:55

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번째 인자는 당연히 포인터)

https://pwn.college/software-exploitation/format-string-exploits/

 


 

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은 문자열의 끝이기 때문)

https://softsec.kaist.ac.kr/depot/sangkilc/cs492e/11-format.pdf

 

 

결론은 충분한 공간만 주어지면 '$' 문자 없이도 순서대로 읽어나가면서 도달할 수 있다는 것이다.

https://softsec.kaist.ac.kr/depot/sangkilc/cs492e/11-format.pdf

 

 

메모리에 값을 쓸 땐 이미 출력된 문자열의 길이를 고려해줘야 한다.

필요 시 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
    'background/linux' 카테고리의 다른 글
    • [pwn.college] Return Oriented Programming
    • FSOP(File Stream Oriented Programming)
    • [how2heap] Tcache Poisoning (glibc 2.31/2.35)
    • [how2heap] House of Botcake (glibc 2.31)
    ssongk
    ssongk
    벌레 사냥꾼이 되고 싶어요

    티스토리툴바