학습
워게임
CTF
커뮤니티
랭킹
스토어
커리어
Beta
로그인
|
기업 서비스
Home
학습
워게임
CTF
커뮤니티
랭킹
커리어
Beta
기업 서비스로 이동하기 >
LEVEL 2
Return to Library
pwnable
2652
1522
로그인 하고 문제 풀기
문제 정보
풀이
60
난이도 투표
65
질문
20
최근 풀이자
1522
댓글
40
문제 설명
Description
Exploit Tech: Return to Library에서 실습하는 문제입니다.
Translate
출제자 정보
Dreamhack
대표 업적 없음
2021.12.08. 16:20:39
First Blood!
Sechack
CTF First Place
출제된 지
4시간
만에 풀이 완료!
난이도 투표
65
문제 풀이를 완료한 후에 피드백을 제출할 수 있습니다.
투표 결과
전체 투표 로그
1 / 13
apman
대표 업적 없음
LEVEL 2에 투표했습니다.
17일 전
양갱
공부벌레
LEVEL 1에 투표했습니다.
19일 전
reaunper
대표 업적 없음
LEVEL 2에 투표했습니다.
1개월 전
댕댕180
워게임 고인물
LEVEL 2에 투표했습니다.
2개월 전
Mooney
워게임: 50
LEVEL 2에 투표했습니다.
2개월 전
질문
20
문제 풀이에 어려움이 있으신가요?
커뮤니티에서 문제에 대한 질문하고 답변 얻기
ret 값으로 들어가는 주소가 의미하는 것이 뭔가요?
ret에 0x400825 주소가 들어가는데 ret주소에 pop rdi를 바로 쓰지 않는 이유는 알겠는데, 저 값이 왜 들어가야 하는건가요? 메모리 덤프찍어보니 __libc_csu_init 관련 주소인것 같은데요
이무쿤
답변
1
추천
4
2년 전
recv 관련해서 궁금한것이 있습니다.
해당 문제의 소스코드입니다 setvbuf(stdin, 0, _IONBF, 0); setvbuf(stdout, 0, _IONBF, 0); system("echo 'system@plt"); // Leak canary printf("[1] Leak Canary\n"); printf("Buf: "); read(0, buf, 0x100); printf("Buf: %s\n", buf); 이 소스코드를 보면 read하기전에 system함수로 echo로 출력 한번 print로 출력 두번이 있는데 로컬에서 실행할때는 익스플로잇 코드에 print(p.recvline()) print(p.recvline()) print(p.recv(10)) 을 처음에 해주니 b'system@plt\n' b'[1] Leak Canary\n' b'Buf: ' 이렇게 출력이 되는데 서버로 공격을 수행하니 b'[1] Leak Canary' 이것만 출력되고 멈추길래 p.recv(1024)하나만 출력시켜보니 b'[1] Leak Canary\nBuf: ' 이렇게 출력되더라고요 분명 로컬로 실행시킬땐 b'system@plt\n' 이게 출력됐었는데 서버로 수행할때는 왜 b'system@plt\n' 가 출력이 안되는건지 궁금합니다
Dendrog
답변
1
추천
2
2년 전
gdb에서 프로그램이 실행되지 않습니다.
캡처 위 사진처럼 처음 카나리 릭을 위해서 buf를 입력받는 시점에 프로그램이 멈춥니다. 그리고 다시 r로 실행하니 셸만 뜨고 아무 명령을 입력하면 gdb까지 종료됩니다. 아무리 검색해봐도 관련된 내용으로 쓰인 글이 보이지가 않습니다 ㅠㅠ
SuperVingo
답변
1
추천
2
2년 전
ret의 주소와 gadget의 개념에 관해 질문 있습니다.
ret 주소와 gadget의 개념에 대해 질문이 있습니다. 리턴 가젯은 ret 명령어로 끝나는 어셈블리 코드 조각을 의미한다고 하였는데, pop rdi; ret의 경우 pop rdi가 실행된 후, ret 가 실행된다는 뜻의 2단계 코드 조각을 말하는 것인가요?? 아니라면 무슨 의미인가요? ROPgadget --binary rtl 명령어의 결과가 아래의 사진과 같은데, 여기서 어떤 가젯을 사용 하는 지는 어떻게 정하나요?? 그냥 아무 가젯이나 사용해도 되나요? 풀이에서 왜 ret를 사용했는지 궁금합니다. image.png 세 번째로는 이 문제에서 의미없는 문자열로 57byte만큼 채운 후, canary를 leak하고, 다시 의미 없는 문자열로 8byte를 덮은 다음, 원래는 main 함수의 ret 하는 코드가 있지만, ROPgadget --binary rtl에서 찾은 코드로 덮어버렸고 그 후 pop rdi로 /bin/sh의 주소를 rdi에 넣고 system 함수를 실행시켜서 shell을 획득하는 것으로 이해를 했는데 image.png 여기서 pop rdi; ret가 아니라 pop rdi, /bin/sh의 주소, system 함수 호출 이렇게 3단계로 진행되어야 하는 거 아닌가요?? 왜 pop rdi가 아니라 pop rdi; ret인지 궁금합니다. pop rdi를 한 후, ret를 해버리면 system 함수를 호출할 수 없는 것 아닌가요??
mia7a
답변
2
추천
2
9개월 전
return address overwrite 원리
stack 에 아래와 같이 쌓으면 system("/bin/sh") 가 실행되는 것으로 이해됩니다. SFP 다음의 return address 는 buf 를 위치를 말하는 것인가요? 그리고 return addr 아래로 pop rdi, "/bin/sh" 위치, system@plt 주소를 쌓아놓으면 어떻게 system("/bin/sh") 가 실행이 되는지 궁금합니다. buf canary SFP return addr pop rdi /bin/sh 의 주소 system@plt addr of ("pop rdi; ret") <= return address addr of string "/bin/sh" <= ret + 0x8 addr of "system" plt <= ret + 0x10 ret = 0x400285 에서 0x400285 는 어디서 얻어지는지 알고 싶습니다. ubuntu22.04 에서 gcc -o rtl rtl.c -fno-PIE -no-pie 로 빌드했을때는 pwndbg> plt 를 해도 system@plt 가 보이지 않습니다. 문제에서 주어진 ./rtl 을 사용하면 system@plt 주소가 보입니다. 어떤 차이가 있을까요? buf 의 주소가 buf = b"A"*0x39 이라서 buf 사이즈는 0x38 로 어셈블러가 구성된다고 볼수 있습니다. 소스코드에서는 char buf[0x30] 입니다. 왜 어셈블러에서는 8이 더 크게 잡혔을까요? main 함수를 assembly 로 확인해보면 아래와 같이 sub rsp, 0x40 이라서 buf 가 마치 0x40 만큼 잡힌것으로 보여지는데 왜 0x38 로 해야 동작하는지 궁금합니다. ► 0x4006f7 <main> push rbp 0x4006f8 <main+1> mov rbp, rsp 0x4006fb <main+4> sub rsp, 0x40 <<<<< buf 0x4006ff <main+8> mov rax, qword ptr fs:[0x28] 0x400708 <main+17> mov qword ptr [rbp - 8], rax 0x40070c <main+21> xor eax, eax
robinkim129
답변
1
추천
1
11개월 전
질문 세 개
buf와 canary 사이에 있으면서 길이가 0x8인 값의 정체는 무엇인가요? pop rdi; ret 직후에 /bin/sh의 주소를 넣는 게 어떻게 rdi가 그 주소를 가리키도록 하는 결과를 낳나요? 저는 이 문제를 무차별 대입법으로 풀었습니다. 실제로 써야 하는 no-op gadget 값은 무엇이며, 왜 그 값을 써야 하나요?
모레
답변
1
추천
0
1년 전
RTL
image.png image.png payload 짜고 실행하면 위 사진처럼 오류가 뜨는데 python 버전 때문인가요..? 왜 그러는지 모르겠습니다..
oog
답변
2
추천
0
1년 전
잘 모르겠습니다
강의 내용을 보면 이런 부분이 있습니다. addr of ("pop rdi; ret") << return address addr of string "/bin/sh" << ret + 0x8 addr of "system" plt << ret + 0x10 **리턴 가젯을 사용하여 반환 주소와 이후의 버퍼를 다음과 같이 덮으면, pop rdi로 rdi를 "/bin/sh"의 주소로 설정하고, 이어지는 ret로 system 함수를 호출할 수 있습니다.** pop rdi를 사용해서 rdi에 "/bin/sh"의 주소가 어떻게 들어가는지 모르겠습니다. 그리고, ret 후 system() 함수가 어떻게 호출 가능한지...
Mooney
답변
1
추천
0
2개월 전
PLT 주소..
system 함수 주소를 puts_plt = e.plt["system"] <- 같이 안 구하고 puts_plt = p64(0x시스템 함수 주소) 이렇게 주소를 직접 넣어 문제를 풀었습니다. plt 주소는 ASLR이 걸려있어도 PIE가 안 걸려있으면 주소가 안 변해서 로컬에서 풀리는 건 이해가 되는데 리모트에서는 왜 풀리는지 이해가 되지 않습니다... 로컬 PLT 주소와 리모트 PLT 주소가 왜 같은가요..?
oog
답변
1
추천
0
1년 전
dummy buf의 정확한 값
dummy buf의 정확한 값을 알 수 있는 방법이 있을까요? gdb에서는 buf가 0x40으로 찍히는데, 왜 카나리 leak할때 페이로드를 "A" * 0x39로 보내나요?
cccclllllhhhhnn
답변
2
추천
0
1년 전
«
‹
1
2
›
»
최근 풀이자
1522
블랙레이져
대표 업적 없음
1시간 전
bimil
대표 업적 없음
4시간 전
저스트인선
대표 업적 없음
9시간 전
2p/1h
대표 업적 없음
23시간 전
cyalume
강의 수강: 10
1일 전
potatoisveryummy
대표 업적 없음
1일 전
채챙
대표 업적 없음
2일 전
dretoh
대표 업적 없음
2일 전
The Yoshi
대표 업적 없음
3일 전
le0s1mba
워게임 고인물
3일 전
«
‹
1
2
3
4
5
›
»
댓글
40
daeseong1209
대표 업적 없음
11일 전
매우 쉬운!
Translate
머더뻐킨 릴 투더 빅 뽀이 예아 그ㄹㄹㄹㄹ라
대표 업적 없음
14일 전
어렵지만 꽤 많이 배운듯
Translate
스카이넷
강의 수강: 10
4개월 전
ez
Translate
O_F
대표 업적 없음
9개월 전
좋습니다.
Translate
buaii
워게임 고인물
10개월 전
GOT...
Translate
Huni
대표 업적 없음
11개월 전
good...
Translate
HYN
워게임 고인물
11개월 전
good
Translate
sinse100
대표 업적 없음
1년 전
remind the alignment
Translate
l000wk3y
공부벌레
1년 전
gg
Translate
hyuunn
강의 수강: 10
1년 전
홀리 풀었다
Translate
«
‹
1
2
3
4
›
»
댓글 40