본문 바로가기

Wargame/pwnable.kr

[Toddler] fd

요즘 플스4 파이널판타지7 리메이크 즐긴다고 문제를 안 풀고 있는데; 뭐라도 써야지 싶어서 쉬운 문제를 풀어봤다.

(파이널판타지7 개꿀잼 ㅜㅠㅠㅠ)

 

너무 쉽다.. 무려 29458명이 푼 문제이다. 와우! 이거 못풀면 해킹은 꿈도 꾸지 말라는 것 같다.

 

1. 코드흐름

====================================================

단순하다.

 

1. argv 값을 하나라도 넣어주지 않았다면 "pass argv[1] a number"가 출력된후 프로그램이 종료된다.

2. argv[1]에 입력한 값을 정수로 바꾼후 - 0x1234 한 뒤 fd에 넣는다.

3. read 함수를 통해 buf 배열에 우리가 입력한 값을 넣어준다.

4. buf에 들어간 값과 LETMEWIN을 비교한 후, 값이 일치하면 /bin/cat flag를 실행한다.

 


2. 고려사항

====================================================

1. argv[1]을 써야한다.

 

3. 필요 지식

====================================================

1. file descriptor가 뭔지 알아야 한다.

관련 주소: mintnlatte.tistory.com/266

 

4. 문제 풀이

====================================================

 

file descriptor는 표준 입력(stdin, 0), 표준 출력(stdout, 1), 표준 에러 출력(stderr, 2)로 구분된다.

문제 풀이를 위해 file descriptor를 0으로 만들 수 있다면 read(fd, buf, 32)를 이용해 값을 입력할 수 있을 것이다.

 

fd = atoi(argv[1]) - 0x1234 중, atoi는 입력한 값을 10진수 정수로 바꾸는 함수이고 0x1234는 16진수이다.

fd를 0으로 만들기 위해서는 0x1234가 10진수로 뭔지 알아야 한다.

 

gdb 를 켜고 p/d 0x1234를 입력하면 4660 이라는 10진수가 출력된다. 즉, 우리가 argv[1]에 4660을 입력하면

fd에 0이 들어간다.

 

그럼 read함수가 실행되는데, 여기서 LETMEWIN을 입력하면 flag가 출력된다.

1
2
3
4
5
6
7
from pwn import *
 
= ssh(user = 'fd', host = 'pwnable.kr', port = 2222, password = 'guest')
= s.process(['fd''4660'])
 
p.sendline('LETMEWIN')
p.interactive()
cs

'Wargame > pwnable.kr' 카테고리의 다른 글

[Grotesque] aeg  (2) 2020.10.03
[Rookies] crypto1  (0) 2020.09.14
[Rookies] note  (0) 2020.09.10
[Grotesque] asg  (0) 2020.08.15
[Toddler] asm  (2) 2020.07.05