본문 바로가기
[ROP emporium]

[ROP emporium] ret2win

by 토끼여우 2026. 6. 1.
728x90
SMALL
728x90

x64 아키텍처의 풀이입니다

 

문제 파일을 실행하면 read함수로  32바이트 스택버퍼에 사용자의 입력을 56바이트만큼 충죽시키는것을 도전할것이다라고 한다

 

 

main함수를 어셈블리로 보면 위에서 바이너리를 실행시켰을때 출력문 2개를 시키는거를 puts함수 2개가 역할을 하는것으로 추측이 된다

그리고 밑에 수상해 보이는 pwnme 함수를 호출하는것이 보인다

 

 

read함수가 보인다 

System V 호출규약에 따라

edi = 0x0, esi = rax([rbp - 0x20], buf[0x20]), edx = 0x38가 순서대로 인자로 들어가서 call을 한다

 

read(0, buf, 0x38)

c언어로 복원하면 다음과 같다

 

rbp-0x20  ┌────────────────────┐
          │ buf[32]            │  ← 0x20 bytes
rbp       ├────────────────────┤
          │ saved RBP          │  ← 8 bytes
rbp+0x8   ├────────────────────┤
          │ saved RIP          │  
          └────────────────────┘

 

스택구조를 보면 다음과 같이 구성된다

ret2win 문제이름에서 볼수있듯이 return address(saved rip)에 플래그를 출력하기 위한 동작의 주소로 덮으면 된다

 

strings 명령어를 이용하여 바이너리의 문자열을 출력한 결과 ret2win이라는 함수가 보인다

또한 /bin/cat flag.txt로 플래그를 출력하는 커맨드가 보인다

system함수를 ret2win에서 처리하는것이 보이므로 이 함수가 /bin/cat flag.txt 명령어를 수행하는 함수인것을 알 수 있다

 

 

다음과 같이 버퍼 20바이트와 sfp 8바이트를 패딩으로 입력하고 

System V 호출규약에 따라 스택에서 함수를 호출하기전 스택을 정렬하기 위해 ret가젯을 이용해 정리를 하고

ret2win함수로 rip영역을 덮는 페이로드를 작성하였다

 

 

728x90
LIST

'[ROP emporium]' 카테고리의 다른 글

[ROP emporium] callme  (0) 2026.06.03
[ROP emporium] split  (0) 2026.06.02