1. rop
1.1 파일 분석 1
- file 명령어로 rop 파일의 종류를 확인해보니 32bit ELF 파일임
- rop 파일을 실행해보니 사용자에게 입력값을 받고 'Hello, World!.' 를 출력함
- ida로 코드를 디컴파일하여 확인해보니 main 함수에는 write 함수가 존재함
- vulnerable_function 함수에는 read 함수가 존재함. 이를 통해 write함수로 출력, read함수로 입력이 가능하여 ROP공격 기법을 사용할 수 있음
1.2 poc
- 5번째 줄 : remote로 워게임 서버에 접속하기 위한 코드
- 6번째 줄 : 해당 프로그램의 함수 주소를 쉽게 사용할 수 있도록 해주는 코드
- 7번째 줄 : 라이브러리 주소를 쉽게 사용할 수 있도록 해주는 코드
- 9번째 줄 : ROPgadget을 통해 찾아낸 rop파일의 pop pop pop ret 가젯의 주소
- 10번째 줄 : ROPgadget을 통해 찾아낸 rop파일의 pop ret 가젯의 주소
- 12번째 줄 : bss영역의 주소를 쉽게 사용할 수 있도록 해주는 코드
- 13번째 줄 : binsh 변수에 "binsh" 문자열을 저장하는 코드
- 16~17번째 줄 : vulnerable_function 함수에 있는 buf[136] + SFP[4]를 덮기 위한 코드
- 19~23번째 줄 : pppr가젯을 통해 write함수로 read함수의 god 주소를 출력하여 leak하는 코드
- 25~29번째 줄 : pppr가젯을 통해 read함수로 bss영역에 값을 입력하는 코드
- 31~35번째 줄 : pppr가젯을 통해 read함수로 write함수의 got를 덮는 코드
- 37~39번째 줄 : bss변수에 입력된 값('/bin/sh\x00')을 인자로 write함수의 plt(system함수)를 실행하는 코드
- 41번쨰 줄 : payload에 담긴 값을 대상 서버에 전송하는 코드
- 42번째 줄 : 19~23번째줄의 코드에서 leak해준 read함수의 got주소를 read_leak 변수에 저장하는 코드
- 43번째 줄 : read함수의 got주소에서 read함수 주소의 offset을 구하여 base주소를 알아내는 코드
- 44번째 줄 : 43번째 줄에서 알아낸 base주소를 통해 system함수의 주소를 알아내 system 변수에 저장하는 코드
- 46~47번째 줄 : read_leak과 system 변수의 값을 확인하기 위한 코드
- 49번째 줄 : 서버에 binsh 변수에 담긴 값을 대상 서버에 전송하는 코드
- 51번째 줄 : system함수 주소를 p32로 패킹하여 서버에 전송하는 코드
- 53번째 줄 : 대상과 지속적으로 통신하기 위한 코드
1.3 결과
- 위에 작성한 코드(poc)로 flag를 따낼 수 있었음
'Wargame > HackCTF' 카테고리의 다른 글
RTL_World Write-Up (0) | 2021.09.19 |
---|---|
x64 Simple_size_BOF Write-Up (0) | 2021.09.16 |
내 버퍼가 흘러 넘친다!!! Write-Up (0) | 2021.09.16 |
x64 Buffer Overflow Write-Up (0) | 2021.09.08 |
Basic_BOF#2 Write-Up (0) | 2021.09.08 |