목록Flag (27)
ii4gsp
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/5R9B5/btqBQ2aaxY6/2zgKf3YjHKUKEk1YgSyyYk/img.png)
파일을 다운받아 주자. IDA로 열어보면 vuln()함수에서 return printf(&format); 부분에서 포맷스트링 버그가 일어난다. 쉘을 실행시키는 flag()함수가 있다. printf의 got를 flag()함수의 주소로 조작해주면 된다. flag()함수의 주소는 0x080485B4 이다. 0x080485B4는 10진수로 134,514,100이다. from pwn import * r = remote('ctf.j0n9hyun.xyz', 3002) e = ELF('/home/ii4gsp/HackCTF/basic_fsb') printf_got = e.got['printf'] payload = p32(printf_got) payload += "%134514096x%n" r.recvuntil(":") r..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cxzDo4/btqBO7JSULC/8FVPVNUkBfhBgH2gqWapvK/img.png)
파일을 다운받아 주자. IDA로 열어보면 s는 128만큼 할당받았다. fgets()함수에서는 133byte만큼 입력받는다. v5는 sup()함수를 가리키고있다. 128byte를 주고 shell()함수의 주소를 전달하면 쉘을 획득한다. shell()함수의 주소는 0x0804849B이다. from pwn import * r = remote("ctf.j0n9hyun.xyz", 3001) payload = '' payload += '\x90' * 128 payload += p32(0x0804849B) r.sendline(payload) r.interactive() 소스코드를 작성해주자.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cdY3Q4/btqBO7QtWRg/MXwJGQ5zM9nCOHiMOKk5Z1/img.png)
파일을 다운로드 해주자. IDA로 열어보면 scanf()함수로 v4, v5, v6에 입력을 받는다. v7[v6]에 v4와 v5를 더한값을 넣고 값을 출력한다. result에 0을넣고 return한다. win()함수가 실행되면 flag가 출력된다. result의 값을 win()함수의 주소로 조작해주면 win()함수가 실행된다. v4에 win()함수의 주소를 입력하고 v5에는 0을 입력한다. v6에 13을 입력하면 result의 주소에 접근할 수 있다. from pwn import * r = remote("svc.pwnable.xyz", 30002) e = ELF('./challenge') win = e.symbols['win'] payload = '' payload += str(win) + ' 0 13' ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b1JGIq/btqBODWsAQ2/1wO1GWZOQaVKhByPeXhLU0/img.png)
파일을 다운로드 해주자. IDA로 열어보면 scanf()함수로 v4와 v5에 입력을받고 v4 - v5가 4919가 되어야 flag를 볼 수 있다. scanf()함수는 %u로 입력을 받는다. -4918을 입력하면 -(-4918)이 된다. v4에 1을 입력하고 v5에 -4918을 입력해주면 1 + 4918이 된다. from pwn import * r = remote("svc.pwnable.xyz", 30001) r.recvuntil(":") r.sendline("1 -4918") r.sendline("asd") r.interactive() 소스코드를 작성해주자.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/VVqha/btqBQnrLIPO/D6ygxHTkreqixISPN9HFsK/img.png)
파일을 다운로드 해주자. 다운로드한 파일을 IDA로 열어보면 v3가 0이라면 flag를 출력해준다. v3를 0x40000만큼 할당해주고 v3의 값에 1을 넣었다. 그리고 v3의 주소를 출력해주고 메세지의 길이를 입력받는다. scanf로 size에 메세지 길이를 입력하고 v5에 size만큼 할당한다. v5[size - 1] = 0을 보면 메세지의 마지막 원소를 0으로 만든다. 이부분을 이용해서 v3를 0으로 만들어주면 된다. v3의 주소를 출력해주니 주소에 +1한 값을 넣으면 size - 1부분에서 -1이 됨으로 v3의 시작주소를 가리킨다. 그리고 값이 0이 되고 if문을 통과해 flag를 볼 수 있다. from pwn import * r = remote("svc.pwnable.xyz", 30000) r...
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cWDw23/btqBIHYxoH2/adkAMLnCGlMVWx5WiHY7H0/img.png)
ssh서버에 접속해주자. random파일의 소스코드를 보면 변수 random 변수에 랜덤 값을 넣고 변수 key에 입력을한다. 입력한 key와 random을 xor연산은 하고 0xdeadbeef와 같으면 flag를 볼 수 있다. gdb로 파일을 열어보자. rand()함수가 호출되고 난 다음의 부분에 break point를 걸어주고 값을 확인해보면 random의 값은 0x6b8b4567이다. 0x6b8b4567과 0xdeadbeef가 xor을 하게되면 3039230856이 된다. 0x6b8b4567 ^ 3039230856은 3735028559이다. 3735028559를 hex값으로 출력하면 0xdeadbeef이다. Flag: Mommy, I thought libc random is unpredictable..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bNN1ex/btqBHUKlRVn/2D3DvHgAUB0BiXQIRu5Xd0/img.png)
ssh서버에 접속해주자. col파일의 소스코드를 보면 argv[1]이 20byte가 아니면 안되고 hashcode와 check_password(argv[1])의 값이 같아야한다. check_password()함수는 4byte씩 나눠서 받기때문에 hashcode의 값 0x21DD09EC를 5로 나눠주자. hashcode의 값을 5로 나누면 0x6C5CEC8이 나온다 다시 곱하기 5를 해주자. 0x21DD09EC에서 -4된 0x21DD09E8이 나온다. 0x6C6CEC8 + 4의 값 0x6C5CECC를 리틀 엔디언 방식으로 전달해주면 된다. Flag: daddy! I just managed to create a hash collision :) payload ./col $(python -c 'print "\x..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ZL1IA/btqBtX8ASiY/WrvqAwNyU23lIzhEnRoVMK/img.png)
ssh fd@pwnable.kr -p2222로 서버를 접속해주자. 접속 후 파일을 확인해보면 fd, fd.c, flag파일이 보인다. 권한이 없기때문에 flag파일을 볼 수 없다. 소스코드를 보도록 하자. read() 함수에서 첫번째 인자fd가 0이면 표준 입력, 1이면 표준 출력, 2이면 표준 에러가된다. fd는 argv[1]을 통해 입력을 받고 0x1234만큼 뺀다. 0x1234는 10진수로 4660이다. argv[1]에 4660을 넣어주면 4660 - 4660 = 0 임으로 표준 입력을 할 수 있다. buf는 "LETMEWIN"이여야 하며 fd의 값을 0으로 하게 해서 입력을 받도록 하고, LETMEWIN을 입력하면 된다. Flag: mommy! I think I know what a file de..