security/포너블 - pwnable.kr

pwnable.kr - [Toddler's Bottle] flag

민사민서 2023. 2. 5. 22:26
- wget http://pwnable.kr/bin/flag 통해서 다운로드 받는다
cf) 뒤에 -no-check-certificate 붙이면 신뢰할 수 없는 사이트도 ㄱㅊ
- file ./flag 해보면 얻을 수 있는 정보
  ㄴ ELF 64bit LSB executable
  ㄴ statically linked, stripped
- chmod +x ./flag 하고 실행시켜봤더니 (rw-rw-r--였음)
 I will malloc() and strcpy the flag there. take it.  !!
- stripped file이어서 symbol table 등등 실행시 불필요한 내용 삭제
- disas main 해도 symbol table 없어서 정보 못얻음
> b *0x0 한다음 r해서 실행시키고, vmmap해서 메모리 정보 확인
-----------------------------------------------------------
심볼테이블 없다: 패킹 의심
패킹되어있는 바이너리는 objdump 로  파일의 헤더를 확인하거나 디스어셈블등이 되지 않는다.
file '파일이름'으로 파일 정보를 확인해도 평소에 나오는 정보보다 훨씬 적은 정보만 나오는 것을 확인 할 수 있다.
바이너리 패킹 확인은 윈도우에서 더 쉽게 확인 할 수 있는데 PEID 를 이용해 대상 프로그램을 스캔 해 확인 할 수 있다.
=> strings ./flag | grep "UPX" 해도 검색결과 존재!!

upx 설치 후 upx -d ./flag 하면 언패킹된다 
// upx -d "생성될 언패킹 파일 경로" "언패킹에 사용할 파일 경로"
file ./flag 하면 이젠 unstripped 된 상태임!

- disassemble main 하면 puts 통해 우리가 본 메시지 출력
- malloc(0x64) 함, rdx에 플래그 문자열 주소 저장 (x/s 0x496628)
- rdi에 malloc한 포인터, rsi에 rdx 값 넣은 후 0x400320 호출
- 이 함수 안에서 strcpy가 이루어지넹

편법: i var flag 해서 flag 변수 주소 확인(0x6c2070)
x/gx 0x6c2070해서 flag 변수에 담긴 문자열 주소 확인(0x496628)
x/s 0x496628 해서 flag 문자열 값 확인


정답: UPX...? sounds like a delivery service :)