import
string
from
pwn
import
*
def
L_TRUE():
return
"(\\x \\y x)"
def
L_FALSE():
return
"(\\x \\y y)"
def
L_ZERO():
return
"(\\f \\x x)"
def
L_SUCC():
return
"(\\n \\f \\x n f (f x))"
def
L_NUM(n):
s
=
L_ZERO()
for
_
in
range
(n):
s
=
"("
+
L_SUCC()
+
" "
+
s
+
")"
return
s
def
L_FLAG_NODE(i):
return
(
"(\z %d )"
%
i)
def
L_SUB():
return
"(\\m\\n n "
+
L_PRE()
+
" m)"
def
L_PRE():
return
"(\\n\\f\\x "
+
L_CDR()
+
" (n ("
+
L_PREFN()
+
" f) ("
+
L_CONS()
+
" x x)))"
def
L_CDR():
return
"(\\p p "
+
L_FALSE()
+
")"
def
L_CONS():
return
"(\\x \\y \\f f x y)"
def
L_PREFN():
return
"(\\f \\p "
+
L_CONS()
+
" (f ("
+
L_CAR()
+
" p)) ("
+
L_CAR()
+
" p))"
def
L_CAR():
return
"(\\p p "
+
L_TRUE()
+
")"
def
L_ADD():
return
"(\\m \\n \\f \\x m f (n f x))"
def
L_IF():
return
"(\\p \\x \\y p x y)"
def
L_NOT():
return
"(\\p \\a \\b p b a)"
def
L_XOR():
return
"(\\a \\b a ("
+
L_NOT()
+
" "
+
"b"
+
") b)"
def
L_MULT():
return
"(\\m \\n \\f m (n f))"
def
H_ADD(l, r):
return
"("
+
L_ADD()
+
" "
+
l
+
" "
+
r
+
")"
def
H_MULT(l, r):
return
"("
+
" "
.join([L_MULT(), l , r])
+
")"
def
H_SUB(l, r):
return
"("
+
" "
.join([L_SUB(), l , r])
+
")"
def
H_XOR(l, r):
return
"("
+
" "
.join([L_XOR(), l , r])
+
")"
def
H_ABSDIFF(l, r):
return
H_ADD(H_SUB(l, r), H_SUB(r, l))
import
random
def
challenge(flag, seed):
random.seed(seed)
sub_eq
=
[]
flag_seq
=
[]
for
c
in
bytes(flag):
flag_seq.append(c &
0xf
)
flag_seq.append(c >>
0x4
)
s
=
L_NUM(
0
)
for
i
in
range
(
len
(flag_seq)):
l1
=
random.randint(
1
,
10
)
d2
=
random.randint(
1
,
10
)
target
=
flag_seq[i]
*
l1
+
d2
print
((l1, d2, target),
","
)
sub_eq.append(H_ABSDIFF(H_ADD(H_MULT(L_FLAG_NODE(i), L_NUM(l1)), L_NUM(d2)), L_NUM(target)))
for
exp_i
in
range
(
len
(sub_eq)):
s
=
H_ADD(s, sub_eq[exp_i])
return
s
def
compile_data(text):
p
=
process([
"lambda/lambda"
,
'xxxx'
])
p.sendline(text)
return
p.recvall().decode(
'utf-8'
)
def
data2array(name, data):
return
"char "
+
name
+
"[] = {"
+
","
.join([
hex
(c)
for
c
in
data.encode(
"ASCII"
)])
+
", 0x0};"
def
gen_text_arr(t):
return
(
"char * arr[] = {"
+
","
.join([
'"%s"'
%
x
for
x
in
t])
+
"};"
).replace(
"\\","
\\\\")
ts
=
[L_NUM(i)
for
i
in
range
(
16
)]
ts.append(challenge(b
"pediy{Lambda6}"
,
2
))
rr
=
gen_text_arr(ts)
open
(
"lambda/text_chall.h"
,
"w"
).write(rr)
input
(
"step2"
)
l
=
[]
for
i
in
range
(
16
):
r
=
open
(
"tests/enc/data_"
+
str
(i)
+
".txt"
,
"r"
).read()
l.append(data2array(
"num_%d"
%
i, r))
open
(
"lambda/nums.h"
,
"w"
).write(
"\n"
.join(l))
open
(
"lambda/chall.h"
,
"w"
).write(data2array(
"chall"
,
open
(
"tests/enc/data_16.txt"
,
"r"
).read()))