P4C/W6

드림핵 시스템 해킹 STAGE 7~12, LEVEL 1 올클리어+

champol 2023. 3. 11. 14:58
드림핵 시스템 해킹 STAGE 7~12

 

Stage 7~12

 

 

워게임 시스템 해킹 LEVEL 1 문제

 

memory_leakage

주어진 c파일을 보면 메모리가 idx, name, age, flag_buf 순으로 되어 있다. name을 출력할 때 사용되는 %s는 널바이트가 나오기 전까지 전부 출력한다. 따라서 name 16비트, age에는 널바이트가 없도록 (0x11111111==286331153)을 넣고 2번을 실행하면 된다. age에 -1을 입력해도 된다.

 

rtld

oneshot 문제와 비슷하게 one_gadget을 사용해야 한다. 문제에서 주어진 라이브러리 파일을 이용해 one_gadget libc.so.6 명령어로 offset을 구한다. stdout 주소에서 stdout offset을 빼서 라이브러리 베이스 주소를 구한다. 라이브러리 베이스 주소에 onegadget을 더해서 oneshotgadget의 주소를 구한다. _dl_rtld_lock_recursive주소를 입력하고 oneshotgadget의 주소를 입력하면 된다.

 

https://xerxes-break.tistory.com/302

 

pwntools를 이용해서 libc에서 함수 및 stdin,stdout 오프셋구하기

lib = ELF("라이브러리") lib.symbols['함수명'] 으로 offset값을 얻어올 수 있다. 여기서 stdout이나 stdin의 offset을 구할때 그냥 lib.symbols['stdout']이나 lib.symbols['stdin']으로 해서 offset을 구해서 stdout,stdin의 위

xerxes-break.tistory.com

 

Format String Bug

입력받는 buf를 printf 함수의 인자로 사용하므로 포맷 스트링 버그가 발생한다. PIE 기법이 적용되어 있으므로 PIE 베이스 주소를 먼저 얻는다. pwndbg의 piebase 명령어를 이용하면 된다. %n은 현재까지 출력된 문자열의 길이를 인자에 저장한다. width를 사용해 최소 길이를 지정하고 그보다 작으면 패딩 문자를 추가한다. %1337c%8$nAAAAAA에 뒤에 changme의 주소를 붙이는 포맷 스트링을 구성하고 실행하면 된다.

 

Bypass IO_validate_vtable

IO_str_overflow 함수의 주소를 알아내고 거기서 -16을 한 주소를 fake_vtable로 저장한다. 또한 "/bin/sh" 의 주소와 system 함수의 주소를 미리 계산한다. 그 후 _IO_buf_end를 "/bin/sh"의 주소로, _IO_buf_base를 0으로 조작한다. 그 다음 vtable의 주소를 IO_str_overflow - 16의 주소로 덮어쓰면 fclose는 IO_str_overflow의 함수를 호출하게 된다. 조작한 fake_vtable 주소 뒤에 system 함수의 주소를 덮어쓰면 system("/bin/sh")가 실행된다.

 

https://learn.dreamhack.io/272#12

 

로그인 | Dreamhack

 

dreamhack.io

 

https://learn.dreamhack.io/11#54

 

로그인 | Dreamhack

 

dreamhack.io

 

 

atleast_I_tried..!

5주차 때 못 풀었던 rtld, format string bug, bypass io_validate_vtable 3문제와 새롭게 level1으로 추가된 memory_leakage까지 총 4문제를 풀었습니다.

 

빡공팟 덕분에 아무것도 모르는 상태에서 무엇을 모르는지는 아는 상태가 될 수 있었던 것 같습니다. 감사합니다.

'P4C > W6' 카테고리의 다른 글

C언어로 키로거 구현+  (0) 2023.03.11